2014-11-03 21 views
2

所以我有一個貓鼬架構,看起來像這樣:Mongoose的填充方法打破了承諾鏈?

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 fieldresponsibleTo.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); 
    }); 
}; 

我的問題是,當我運行populate方法,第一個查詢(如圖所示),這是行不通的。我拿走了人口和它的作品。填充方法是否會破壞諾言是真的嗎?如果是這樣,是否有更好的方法來實現我想要的?

回答

0

這已經有一段時間,因爲你問,但是這可能仍然幫助別人所以在這裏,我們去:

According to the docs.populate()不返回的承諾。要發生這種情況,你應該鏈接.execPopulate()

或者,您可以在.exec()之前加.populate()。後者將終止查詢構建器接口併爲您返回一個承諾。