2013-08-21 316 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方法。

我不禁想着有更好的方法来做到这一点。