当前位置: 首页 > 知识库问答 >
问题:

Mongoose子文档与嵌套模式

云长恨
2023-03-14

我很好奇在我的主模式中使用子文档和更深层文档的利弊:

var subDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [subDoc]
});

或者

var mainDoc = new Schema({
  names: [{
    name: String
 }]
});

我目前到处都在使用subdocs,但我主要想知道我可能遇到的性能或查询问题。

共有3个答案

田成仁
2023-03-14

如果是静态文档或由于性能影响而不超过几百个,则应使用嵌入式文档。关于那个问题我已经讨论了一段时间了。最近,作为MongoDB解决方案架构师的Asya Kamsky写了一篇关于“使用子文档”的文章。

我希望这有助于世卫组织寻找解决方案或最佳做法。

http://askasya.com/post/largeembeddedarrays的原始帖子。你可以在https://stackoverflow.com/users/431012/asya-kamsky找到她的Stackoverflow档案

首先,我们必须考虑为什么我们要做这样的事情。通常情况下,我会建议人们在获取此文档时嵌入他们总是想得到的东西。另一方面,您不想在文档中嵌入您不想返回的内容。

如果您将我执行的活动嵌入到文档中,一开始它会非常有效,因为我的所有活动都在那里,只需一次阅读,您就可以获得您可能想要显示给我的所有内容:“您最近点击了此项,这是您最后的两条评论”但是六个月后会发生什么,我不在乎我很久以前做过的事情,你也不想给我看,除非我特别去寻找一些旧的活动?

首先,您将返回越来越大的文档,并关心其中越来越小的部分。但是您可以使用投影只返回阵列的一部分,真正的痛苦是磁盘上的文档将变得更大,即使您只将其中的一部分返回给最终用户,它仍然会被读取,但由于只要我处于活动状态,我的活动就不会停止,文档将继续增长。

最明显的问题是最终会达到16MB的文档限制,但这根本不是您应该关心的。一个不断增长的文档每次必须在磁盘上重新定位时都会带来越来越高的成本,即使您采取措施减轻碎片化的影响,您的写操作总的来说也会过长,从而影响整个应用程序的总体性能。

您还可以做一件事,这将完全扼杀您的应用程序的性能,那就是索引这个不断增加的数组。这意味着每次重新定位带有该数组的文档时,需要更新的索引条目的数量与该文档中索引值的数量成正比,数组越大,该数量就越大。

我不想让你害怕在数组非常适合数据模型时使用它们——它们是文档数据库数据模型的一个强大功能,但与所有强大的工具一样,它需要在正确的环境中使用,并且应该小心使用。

经慈
2023-03-14

如果您有在模型的各个部分重复使用的模式,那么为子文档定义单独的模式可能会很有用,这样您就不必重复自己。

符风畔
2023-03-14

根据文件,完全一样。但是,使用模式也会添加一个\u id字段(只要您没有禁用该字段),并且可能会使用更多的资源来跟踪子文档。

备用声明语法

v3中的新增功能如果不需要访问子文档架构实例,还可以通过简单地传递对象文本[…]来声明子文档

 类似资料:
  • 问题内容: 我对在我的主模式中使用子文档和更深层的优缺点感到好奇: 要么 我目前在各处使用子文档,但主要是想知道性能或查询我可能遇到的问题。 问题答案: 根据文档,它是完全一样的。但是,使用Schema也会添加一个字段(只要您没有禁用该字段),并且大概会使用更多资源来跟踪子文档。 备用声明语法 v3中的新增功能 如果不需要访问子文档架构实例,则还可以通过简单地传递对象文字来声明子文档[…]

  • 问题内容: 我正在为我们运行概念验证,以便对ES中更多“标准化”的数据运行嵌套查询。 例如带有嵌套 客户->-名称 -电子邮件-事件->-创建-类型 现在,我可以将给定客户的事件列表移至另一位客户。例如,客户A有50个事件客户B有5000个事件 我现在想将所有事件从客户A移动到客户B 拥有数百万客户的规模,并且在UI中针对图形进行查询,Parent / Child更适合还是应该能够嵌套处理? 在我

  • 我将MongoDB的查询结果作为包含嵌套子文档和子文档数组的文档数组。 问题 我需要按列顺序将结果导出到XLSX。XLSX库仅用于导出顶级属性(如RecordID和RecordType)。我还需要导出嵌套对象和对象数组。给定属性名称列表,例如,属性必须按指定顺序导出到XLSX列。 期望结果 下面是所需的“扁平”结构(或类似结构),我认为应该能够转换为XLSX列。 我正在使用XLSX库将查询结果转换

  • 我用Mongoose定义了以下模式: 我尝试执行以下查询: 查询不响应,并且从不进入回调函数。这很奇怪,因为这种类型的查询(搜索两个字符串字段)适用于我定义的另一个模式,但不适用于这个模式。另一种模式更简单,不需要任何嵌入文档。 [更新] 我试过你的建议,但不行。我认为只有两个选择: 1.我发布的模式有问题。 多谢!

  • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?

  • 问题内容: 在Mongoose文档中的以下地址:http : //mongoosejs.com/docs/embedded- documents.html 有一条声明: DocumentArrays具有一个特殊的方法ID,该ID通过其_id属性(每个嵌入式文档获取一个)来过滤嵌入式文档: 考虑以下代码段: 我的问题是: 文档是否正确?如果是这样,那么我如何找出“ my_id”是什么(在示例中),以