Mongoose深度填充结果在二级

花了1天的时间想完成工作之后,我想是时候请求帮忙了。

我想填充文档的两个级别。

我尝试与填充(),但它似乎只适用于第一级,而不是深填充! 我读了很多,我知道它应该工作,但我想我错过了一些真正愚蠢的东西…

请让我知道我犯了什么错误。

这里是相关的代码。

架构

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 } 

我的尝试(=错误的代码?)

在节点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] } ] } 

它的工作,牢记在你的问题的关键词: 打印 。 用console.log()打印,它只是显示一些(第二)层次的数组中包含的文档的type (用typeof检查)。 如果你这样做:

 console.log(doc.contributions[0].media[0]) 

你会看到你的填充media文件。