Mongoose深度填充多个第二级对象无法正常工作

时间:2016-03-12 11:29:47

标签: node.js mongodb mongoose mongoose-populate

我在这个字段中有一个模型A

var field = {
    foo: String,
    b: [{ type: Schema.Types.ObjectId, ref: 'B' }]
}  

和模型B与这个领域:

var field = {
    c: { type: Schema.Types.ObjectId, ref: 'C' } // let's say this has 3 string field
    d: { type: Schema.Types.ObjectId, ref: 'D' } // so was this
}

基于answer Trinh Hoang Nhu这样做 -

 A.find({_id:req.params.id})
    .populate({ path: 'patient', model: Patient,
        populate: {
            path: 'b',
            model: B
        },
        populate: {
            path: 'c',
            model: C
        },
    })
    .exec(function (err, doc) {
        res.send(doc);
    })

-it应该返回已填充的第二级,但它确实存在,但问题是populate函数上声明的最后path只有.populate({}),在这种情况下只有模型{{ 1}}已填充。但是当您使用模型C更改其位置时,将填充模型B

上面的查询返回如下内容:

B

我期待这样的事情:

[
    {
        "foo":"Bar",
        "b": [
            {
                "c":"a32s1da4fas1a23s1da56s4c",
                "d":{
                    "foo1":"Bar1",
                    "foo2":"Bar2",
                    "foo3":"Bar3"
                }
            },
            {
                "c":"a32s1da4fas1a23s1da56s4d",
                "d":{
                    "foo1":"Bar1",
                    "foo2":"Bar2",
                    "foo3":"Bar3"
                }
            }
            // so on ...
        ]
    }
]

1 个答案:

答案 0 :(得分:8)

我不知道为什么它甚至接受了对象中的多个populate键,它已经被复制了, 你指定填充的是:

 populate: {
            path: 'b',
            model: B
        },
        populate: {
            path: 'c',
            model: C
        },

这里属性populate被复制,只考虑最后定义的属性。

您需要将填充路径指定为一个数组。所以你的populate属性将成为:

 populate: [{
            path: 'b',
            model: B
        },{
            path: 'c',
            model: C
        }]

查询是,

A.find({_id:req.params.id})
    .populate({ path: 'patient', model: Patient,
        populate: [{
            path: 'b',
            model: B
        },{
            path: 'c',
            model: C
        }],
    })
    .exec(function (err, doc) {
        res.send(doc);
    })