2014-11-03 2 views
2

Так у меня есть мангуста схемы, которая выглядит следующим образом:Насыщенный метод Мангуста ломает цепочку обещаний?

var Functionary = new Schema({ 
    person: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Person' 
    }, 
    dateOfAssignment: Date, 
    dateOfDischarge: Date, 
    isActive: Boolean 
}); 

var PositionSchema = new Schema({ 
    name: String, 
    description: String, 
    maxHeadCount: Number, 
    minHeadCount: Number, 
    currentHeadCount: Number, 
    currentlyHolding: [Functionary], 
    historical: [Functionary], 
    responsibleTo: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Position' 
    } 
}); 

* обратите внимание, что документ может ссылаться на положения себя в ResponsibleTo поле.

Теперь я пытаюсь построить метод, который будет искать Positions коллекции, заселить поле currentlyHolding[].person.name field и responsibleTo.currentlyHolding[].person.name, а также возвращать общее количество найденных записей (для целей подкачки на переднем конце).

Вот что мой код выглядит следующим образом:

exports.search = function(req, res) { 
    var result = { 
    records: null, 
    count: 0, 
    currentPage: req.params.page, 
    totalPages: 0, 
    pageSize: 10, 
    execTime: 0 
    }; 

    var startTime = new Date(); 

    var populateQuery = [ 
    { 
     path: 'currentlyHolding.person', 
     select: 'name' 
    }, { 
     path:'responsibleTo', 
     select:'name currentlyHolding.person' 
    } 
    ]; 

    Position.find(
    { 
     $or: [ 
     { name: { $regex: '.*' + req.params.keyword + '.*', $options: 'i' } }, 
     { description: { $regex: '.*' + req.params.keyword + '.*', $options: 'i' } } 
     ] 
    }, 
    {}, 
    { 
     skip: (result.currentPage - 1) * result.pageSize, 
     limit: result.pageSize, 
     sort: 'name' 
    }) 
    .exec() 
    .populate(populateQuery) 
    .then(function(doc) { 
    result.records = doc; 
    }); 

    Position.count(
    { 
     $or: [ 
     { name: { $regex: '.*' + req.params.keyword + '.*', $options: 'i' } }, 
     { description: { $regex: '.*' + req.params.keyword + '.*', $options: 'i' } } 
     ] 
    }) 
    .exec() 
    .then(function(doc) { 
    result.count = doc; 
    result.totalPages = Math.ceil(result.count/result.pageSize); 
    }) 
    .then(function() { 
    var endTime = new Date(); 
    result.execTime = endTime - startTime; 
    return res.json(200, result); 
    }); 
}; 

Моя проблема, когда я запускаю первый запрос с помощью метода заселить (как показано), она не работает. Я забираю населенность, и она работает. Верно ли, что метод популяции нарушит обещание? Если да, есть ли лучшие способы добиться того, чего я хочу?

ответ

0

Это было время, так как вы просили, но это все еще может помочь другим, так что здесь мы идем:

According to the docs, .populate() не возвращает обещание. Чтобы это произошло, вы должны направить .execPopulate().

В качестве альтернативы вы можете поставить .populate() до .exec(). Последний прервет интерфейс построителя запросов и вернет вам обещание.

 Смежные вопросы

  • Нет связанных вопросов^_^