嵌套填充Mongoose

时间:2013-08-21 21:54:16

标签: mongoose

所以我正在尝试填充已填充的文档:

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 个答案:

答案 0 :(得分:1)

帖子是Mongoose Document,这意味着您无法像在那里一样覆盖属性。快速解决方案是在帖子上调用.toObject,然后覆盖回复。

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

toObject将Mongoose文档转换为常规对象,以便您可以覆盖其属性。这里的负面消息是,从那时起,你就不能在帖子上使用Mongoose方法了。

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