不同MongoDB集合中的分片相同

时间:2018-12-12 17:07:59

标签: mongodb sharding

我有一个集合A,其中包含一种类型的文档,而另一个集合B中包含另一种类型的文档。

集合B中有多个文档,它们的字段“ b”具有相同的值,引用了集合A中的字段“ a”。

如果我们分别在“ a”和“ b”上分割两个集合A和B,是否可以确保集合A中具有“ a = foobar”的文档将与集合B中具有“ b”的文档位于同一位置= foobar”?

1 个答案:

答案 0 :(得分:0)

  

如果我们分别在“ a”和“ b”上分拆两个集合A和B,我们可以确保集合A中具有“ a =”的文档将与集合B中具有“ b =”的文档同位。 foob​​ar”?

每个集合都定义了碎片键索引,并且(如MongoDB 4.0一样)集合是独立平衡的。即使两个集合具有相同的分片键,也绝对不能保证chunk ranges或分片分配会对齐。

如果计划使用服务器端查询通过$lookup$graphLookup组合这些集合中的数据,请注意,当前无法从您正在查找的其他集合中分片。对于此用例,您只需要分片其中一个集合。对于分片查找支持,MongoDB问题跟踪器中的监视/更新有一些相关的改进:SERVER-29159(分片$lookupSERVER-27533(分片$graphLookup)。

有几种共同定位数据的方法,但是都有一些警告:

  • 反规范化:将A中最常用的字段复制到B中。这样可以避免连接的需要,从而加快了数据检索的速度,但增加了更新和数据存储的开销。
  • Embed the related data,因此您只有一个分片集合。如果您的馆藏具有非常不同的增长或访问模式,或者一对多的关系很大,这将不是理想的选择。
  • 手动管理数据分发:disable balancing用于这些集合,手动split (or pre-split) chunks以使块范围相同,并使用zone sharding用于分片关联。

有关关系模式的更多信息,请参阅Six Rules of Thumb for MongoDB Schema Design博客系列。它不涉及分片,但仍适用常规数据模型。