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

CEN*_*EDE 3 mongoose mongodb node.js mongoose-populate

我有一个模特A机智这个领域:

var field = {
    foo: String,
    b: [{ type: Schema.Types.ObjectId, ref: 'B' }]
}  
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

基于此答案郑氏晃新和成做这个-

 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);
    })
Run Code Online (Sandbox Code Playgroud)

-it应该返回填充的第二级并且确实如此,但问题是它只是在函数populatepath声明的最后一个.populate({}),在这种情况下只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 ...
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我期待这样的事情:

[
    {
        "foo":"Bar",
        "b": [
            {
                "c":{
                    "foo1":"Bar1",
                    "foo2":"Bar2",
                    "foo3":"Bar3"
                },
                "d":{
                    "foo1":"Bar1",
                    "foo2":"Bar2",
                    "foo3":"Bar3"
                }
            },
            {
                "c":{
                    "foo1":"Bar1",
                    "foo2":"Bar2",
                    "foo3":"Bar3"
                },
                "d":{
                    "foo1":"Bar1",
                    "foo2":"Bar2",
                    "foo3":"Bar3"
                }
            }
            // so on ...
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

Nae*_*ikh 9

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

 populate: {
            path: 'b',
            model: B
        },
        populate: {
            path: 'c',
            model: C
        },
Run Code Online (Sandbox Code Playgroud)

这里属性populate重复,只考虑最后定义的属性.

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

 populate: [{
            path: 'b',
            model: B
        },{
            path: 'c',
            model: C
        }]
Run Code Online (Sandbox Code Playgroud)

而查询是,

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);
    })
Run Code Online (Sandbox Code Playgroud)