【问题标题】:Mongoose deep populate results in [Object] at 2nd levelMongoose deep populate 导致 [Object] 在第 2 级
【发布时间】:2018-03-29 10:28:36
【问题描述】:

在花了 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] } ]
}

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongoose-populate


    【解决方案1】:

    它有效,请记住您问题中的关键字:prints。使用console.log() 打印,它只向您显示包含在数组中的文档的type(使用typeof 检查),用于某些(第二)级别的嵌套。如果你这样做:

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

    您将看到已填充的 media 文档。

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 2016-04-19
      • 2018-06-30
      • 1970-01-01
      • 2019-05-29
      • 2012-07-06
      • 2018-09-10
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多