【问题标题】:mongodb: how to populate a single nested subdocumentsmongodb:如何填充单个嵌套子文档
【发布时间】:2018-01-26 14:02:12
【问题描述】:

我正在使用 mongodb 和 mongoose 编写一个 node.js 应用程序。我似乎在理解如何查询“单个嵌套子文档”方面遇到问题。如果我有如下示例:

var childSchema = new Schema({ name: 'string' });

var parentSchema = new Schema({
  // Array of subdocuments
  children: [childSchema],
  // Single nested subdocuments. Caveat: single nested subdocs only work
  // in mongoose >= 4.2.0
  child: childSchema
});

从 mongoose 文档中,我如何为单个嵌套场景填充子子文档?我尝试使用 ".populate("child").exec..." 但子对象返回 null 即使我可以找到是否从 mongo 命令行运行 db.child.find() 。现在我在文档中看到,您必须调用“parent.children.id(_id)”,但在这种情况下,我不会提前知道 _id。

更新:我删除了填充,它现在似乎可以工作了。

【问题讨论】:

  • 数据是“嵌入的”,所以没有什么可“填充”的,因为它已经存在了。人口是指从其他集合中检索“参考”数据。对于现代 MongoDB 版本,或多或少被 $lookup 取代。但这里也根本不需要。
  • 你能给我看一个上面代码中的例子来演示它应该如何工作吗?
  • 什么例子? “嵌入”意味着它“已经存在”。只需检索文档。任务完成。你有实际存储的东西吗?问题是什么?你做了什么?你还有什么不明白的?
  • 所以,我假设你说它应该只填充而不调用填充方法。如果是这种情况,我也尝试过,但仍然收到 null for child。
  • 你需要展示你实际在做什么以及你期望什么。这与基于呈现模式的“人口”无关。调用.populate() 的行为可能会弄乱您的结果。展示您如何保存数据并展示您如何尝试检索它。基本上阅读How to create a Minimal, Complete, and Verifiable example 并尝试按照那里的描述介绍您的案例。然后我们知道如何解决您的疑虑。或者你自己按照这个过程弄清楚。

标签: node.js mongodb mongoose mongoose-populate


【解决方案1】:

您已经将子文档作为嵌入文档存储在父文档中,因此无需填充。填充适用于在运行查询时存储对要填充的其他文档的引用的情况。这种情况的一个例子是:

var childSchema = new Schema({ name: 'string' });
var childModel = mongoose.model("child", childSchema);

var parentSchema = new Schema({
  // Array of subdocuments
  children: [childSchema],
  child: {
    type: Schema.ObjectId, ref: 'child'
  }
});

现在,如果您在查询 parent 时尝试填充 child,它应该可以工作。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 2016-01-21
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2017-07-25
    • 2021-03-26
    • 2021-07-24
    相关资源
    最近更新 更多