【问题标题】:MongoDB performance. Embedded documents search speedMongoDB 性能。嵌入式文档搜索速度
【发布时间】:2012-05-28 17:07:15
【问题描述】:

我在徘徊是什么让 MongoDB 更快。有一些父文档,其中包含大量嵌入文档,或者有很多父文档,其中包含很少的嵌入文档。

这个问题只涉及查询速度。我不关心重复信息的数量,除非你告诉我它会影响搜索速度。 (不知道MongoDb会不会自动索引Id)

例子:

拥有以下实体,每个实体只有一个 Id 字段:

  • 类(8 个不同的类)
  • 学生(100 名不同的学生)

为了将学生与班级联系起来,如果我能充分利用 MongoDB 的速度:

  • 将所有学生存储在数组中,在他们参加的课程中
  • 在每个学生的内部,我都保存了一个数组,其中包含他们参加的课程。

这个例子只是一个例子。真实情况会涉及数千个文档。

【问题讨论】:

  • 你要查询什么?给定班级的学生?与给定学生上课?跨班级的学生?班级按学生人数排序?
  • 好吧,我将在给定班级中搜索特定学生。

标签: performance node.js mongodb


【解决方案1】:

我将在给定班级中搜索特定学生。

如果是这样,您应该有一个 Student 集合,其中一个字段设置为类(只是类 id 可能比嵌入和复制的类文档更好)。

否则,您将无法正确查询学生:

db.students.find ({ class: 'Math101', gender: 'f' , age: 22 })

将按预期工作,同时将学生存储在他们参加的课程中

{ _id: 'Math101', student: [
     { name: 'Jim', age: 22 } , { name: 'Mary', age: 23 }
  ] }

有(除了重复)查询的问题

db.classes.find ( { _id: 'Math101', 'student.gender': 'f', 'student.age': 22 })

将为您提供包含所有个学生的数学课,只要其中至少有一名女学生和至少一名 22 岁的学生(可能是男性)。

您只能获取主要文档的列表,它将包含所有个嵌入文档,未过滤,see also this related question

不知道MongoDb会不会自动索引Id

唯一的自动索引是“主”文档的主键_id。嵌入文档的任何_id 字段都不会自动建立索引,但您可以手动创建这样的索引。

【讨论】:

  • 我不确定我是否完全理解您的建议。您似乎只允许学生参加学生文档中的一门课程。
  • 不,学生可以参加很多课程,使用数组类型字段,就像您在问题中提出的那样:{ name: 'Jim', gender: 'm', age:23, class: ['Math101', 'Poetry', 'Pottery']}
  • 哦,我明白了。但是现在,在课程文档中,您不会有任何学生相关的信息吗?
  • 是的,班级不认识他们的学生。所以一些其他类型的查询是不可能的。您必须根据想要进行的查询以及更新时需要保持同步的数据来设计数据架构。
  • 好的,蒂洛先生。谢谢你的知识。我明白了,感谢虚拟收藏链接:D
猜你喜欢
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2012-11-18
  • 2011-05-24
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多