Mongoose 深度填充 [Object] 的第 2 级结果
Mongoose deep populate results in [Object] at 2nd level
在花了 1 天的时间尝试完成工作后,我想是时候寻求帮助了。
我想填充文档的 2 层。
我试过 populate() 但它似乎只适用于第一级,而不是深度填充!我在 SO 读了很多书,我知道它应该有用,但我想我错过了一些非常愚蠢的东西......
请让我知道哪里出错了。
这里是相关代码。
架构
var compositionSchema = new Schema({
name: {
type: String,
required: true
},
contributions: [{
type: Schema.Types.ObjectId,
ref: 'Contribution'
}]
});
mongoose.model('Composition', compositionSchema);
var contributionSchema = new Schema({
name: {
type: String,
required: true
},
media: {
type: Schema.Types.ObjectId,
ref: 'Media'
}
});
mongoose.model('Contribution', contributionSchema);
var mediaSchema = new Schema({
name: {
type: String,
required: true
}
});
mongoose.model('Media', mediaSchema);
实际文件保存在MongoDB
作曲:
{
"_id" : ObjectId("59e5db4595fe650a71fb0e07"),
"name" : "Test Pop 7",
"contributions" : [
ObjectId("59e5db4595fe650a71fb0e05")
]
}
贡献:
{
"_id" : ObjectId("59e5db4595fe650a71fb0e05"),
"name" : "Honda",
"media" : ObjectId("59e4ac5dacacd709eac2c856")
}
媒体:
{
"_id" : ObjectId("59e4ac5dacacd709eac2c856"),
"name" : "Logo_big.png",
"width" : 662,
"height" : 540
}
我的尝试(=代码错误?)
在 Node JS 中,当我这样做时(根据文档):
Composition.findOne({ name: "Test Pop 7" })
.populate({
path: 'contributions',
model: 'Contribution',
populate: {
path: 'media',
model: 'Media',
}
})
.exec((error, doc) => {
if (error) { console.log(error); }
else {
console.log(doc);
}
});
打印出来,没有实际填充媒体字段:
{ _id: 59e5db4595fe650a71fb0e07,
name: 'Test Pop 7',
contributions:
[ { _id: 59e5db4595fe650a71fb0e05,
name: 'Honda',
media: [Object] } ]
}
它有效,请记住您问题中的关键字:prints。使用 console.log()
打印,它仅向您显示包含在数组中的文档的 type
(使用 typeof
检查),用于某个(第二)嵌套级别。如果你这样做:
console.log(doc.contributions[0].media[0])
您将看到填充的 media
文档。
在花了 1 天的时间尝试完成工作后,我想是时候寻求帮助了。
我想填充文档的 2 层。
我试过 populate() 但它似乎只适用于第一级,而不是深度填充!我在 SO 读了很多书,我知道它应该有用,但我想我错过了一些非常愚蠢的东西......
请让我知道哪里出错了。
这里是相关代码。
架构
var compositionSchema = new Schema({
name: {
type: String,
required: true
},
contributions: [{
type: Schema.Types.ObjectId,
ref: 'Contribution'
}]
});
mongoose.model('Composition', compositionSchema);
var contributionSchema = new Schema({
name: {
type: String,
required: true
},
media: {
type: Schema.Types.ObjectId,
ref: 'Media'
}
});
mongoose.model('Contribution', contributionSchema);
var mediaSchema = new Schema({
name: {
type: String,
required: true
}
});
mongoose.model('Media', mediaSchema);
实际文件保存在MongoDB
作曲:
{
"_id" : ObjectId("59e5db4595fe650a71fb0e07"),
"name" : "Test Pop 7",
"contributions" : [
ObjectId("59e5db4595fe650a71fb0e05")
]
}
贡献:
{
"_id" : ObjectId("59e5db4595fe650a71fb0e05"),
"name" : "Honda",
"media" : ObjectId("59e4ac5dacacd709eac2c856")
}
媒体:
{
"_id" : ObjectId("59e4ac5dacacd709eac2c856"),
"name" : "Logo_big.png",
"width" : 662,
"height" : 540
}
我的尝试(=代码错误?)
在 Node JS 中,当我这样做时(根据文档):
Composition.findOne({ name: "Test Pop 7" })
.populate({
path: 'contributions',
model: 'Contribution',
populate: {
path: 'media',
model: 'Media',
}
})
.exec((error, doc) => {
if (error) { console.log(error); }
else {
console.log(doc);
}
});
打印出来,没有实际填充媒体字段:
{ _id: 59e5db4595fe650a71fb0e07,
name: 'Test Pop 7',
contributions:
[ { _id: 59e5db4595fe650a71fb0e05,
name: 'Honda',
media: [Object] } ]
}
它有效,请记住您问题中的关键字:prints。使用 console.log()
打印,它仅向您显示包含在数组中的文档的 type
(使用 typeof
检查),用于某个(第二)嵌套级别。如果你这样做:
console.log(doc.contributions[0].media[0])
您将看到填充的 media
文档。