我有一个集合A,其中包含一种类型的文档,而另一个集合B中包含另一种类型的文档。
集合B中有多个文档,它们的字段“ b”具有相同的值,引用了集合A中的字段“ a”。
如果我们分别在“ a”和“ b”上分割两个集合A和B,是否可以确保集合A中具有“ a = foobar”的文档将与集合B中具有“ b”的文档位于同一位置= foobar”?
答案 0 :(得分:0)
如果我们分别在“ a”和“ b”上分拆两个集合A和B,我们可以确保集合A中具有“ a =”的文档将与集合B中具有“ b =”的文档同位。 foobar”?
每个集合都定义了碎片键索引,并且(如MongoDB 4.0一样)集合是独立平衡的。即使两个集合具有相同的分片键,也绝对不能保证chunk ranges或分片分配会对齐。
如果计划使用服务器端查询通过$lookup
或$graphLookup
组合这些集合中的数据,请注意,当前无法从您正在查找的其他集合中分片。对于此用例,您只需要分片其中一个集合。对于分片查找支持,MongoDB问题跟踪器中的监视/更新有一些相关的改进:SERVER-29159(分片$lookup
和SERVER-27533(分片$graphLookup
)。
有几种共同定位数据的方法,但是都有一些警告:
A
中最常用的字段复制到B
中。这样可以避免连接的需要,从而加快了数据检索的速度,但增加了更新和数据存储的开销。有关关系模式的更多信息,请参阅Six Rules of Thumb for MongoDB Schema Design博客系列。它不涉及分片,但仍适用常规数据模型。