猫鼬深度填充多个二级对象不起作用
Mongoose deep populating multiple 2nd level objects not working
我有一个模型 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 by 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);
})
-它应该 return 填充第二层并且它确实存在但问题是它只是 populate
在 .populate({})
函数上声明的最后一个 path
,在这个只有模型 C
被填充的情况。但是当您使用模型 B
更改它的位置时,模型 B
将被填充。
上面的查询 return 是这样的:
[
{
"foo":"Bar",
"b": [
{
"c":"a32s1da4fas1a23s1da56s4c",
"d":{
"foo1":"Bar1",
"foo2":"Bar2",
"foo3":"Bar3"
}
},
{
"c":"a32s1da4fas1a23s1da56s4d",
"d":{
"foo1":"Bar1",
"foo2":"Bar2",
"foo3":"Bar3"
}
}
// so on ...
]
}
]
我期待这样的事情:
[
{
"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 ...
]
}
]
我不知道为什么它甚至接受了对象中的多个 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);
})
我有一个模型 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 by 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);
})
-它应该 return 填充第二层并且它确实存在但问题是它只是 populate
在 .populate({})
函数上声明的最后一个 path
,在这个只有模型 C
被填充的情况。但是当您使用模型 B
更改它的位置时,模型 B
将被填充。
上面的查询 return 是这样的:
[
{
"foo":"Bar",
"b": [
{
"c":"a32s1da4fas1a23s1da56s4c",
"d":{
"foo1":"Bar1",
"foo2":"Bar2",
"foo3":"Bar3"
}
},
{
"c":"a32s1da4fas1a23s1da56s4d",
"d":{
"foo1":"Bar1",
"foo2":"Bar2",
"foo3":"Bar3"
}
}
// so on ...
]
}
]
我期待这样的事情:
[
{
"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 ...
]
}
]
我不知道为什么它甚至接受了对象中的多个 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);
})