2013-08-21 270 views
0

所以我想填充已填充文件:嵌套填​​充貓鼬

postModel 
    .findOne({ 
     _id: postId 
    }).select() 
    .populate('author') 
    .populate('sharedBy') 
    .populate('replies') 
    .exec(function(err, post) { 
     if (err) return err; 

然而,replies陣列將持有一串具有authorsharedBy鍵,我還需要填充帖子。這是我的策略:

.populate('author') 
    .populate('sharedBy') 
    .populate('replies') 
    .exec(function(err, post) { 
     if (err) return err; 
     post.deepPopulate(function(err, post){ 

而且deepPopulate

PostSchema.method('deepPopulate', function(cb) { 
    var post = this; 
    async.map(this.replies, function(reply, done) { 
     mongoose.model('Post', PostSchema).findOne({ 
      _id: reply._id 
     }).select().populate('author').populate('sharedBy').exec(done); 
    }, function(err, replies) { 
     post.replies = replies; 
     cb(err, post); 
    }); 
}); 

它發現replies不錯,但我似乎無法把它們放回中傳遞原來的職位!有任何想法嗎?

回答

1

該帖子是Mongoose Document,這意味着你不能覆蓋你在那裏的屬性。快速解決方案是在帖子上調用.toObject,然後覆蓋回覆。

var postObj = post.toObject() 
postObj.replies = replies; 
cb(err, postObj); 

toObject將Mongoose文檔轉換爲常規對象,以便覆蓋其屬性。否定的是,從那以後,你不能在帖子上使用Mongoose方法。

我不禁想着有更好的方法來做到這一點。