在MongoDB中,唯一索引对分片键施加的实际限制是什么?

时间:2013-10-30 15:29:21

标签: mongodb sharding

Mongo Docs阅读:

  

分片系统不能强制执行群集范围内的唯一索引,除非   唯一字段位于分片键中。

从这里开始:http://docs.mongodb.org/manual/core/sharding-shard-key/

但是,如果分片键应该是唯一索引,或者它可以是唯一索引的前缀,那么对我来说是相当模糊的。

我找到了很多关于这个特定主题的参考资料,但不幸的是,我找不到一个好的“DO和DO NOT”的例子。

总结一下,我的问题将出现在以下示例中: 如果Mongo集合在字段{a,b,c}上具有唯一索引,则以下哪个分片键是正确的:

一个。 {A}
B. {a,b,c}
C. {a,b,c,d}
D. {a,b,d}?

非常感谢。

1 个答案:

答案 0 :(得分:5)

这种限制的原因是分片必须能够检查重复项而不必与其他分片通信。

这意味着必须清楚它所残留的碎片的索引的每个可能值。碎片只能确定当碰撞文档也存储在自身时,值才是唯一的。

这意味着当分片键只是索引的一部分时是可以的,但是当索引只是分片键的一部分时则不行。

对于您的示例,分片键 A和B可以使用,但C和D不会。当场景C或D中的分片会收到字段a,b和c与其所具有的任何内容不匹配的文档时,仍然可能存在a,b和c上具有相同值的文档但是d的值不同在另一个碎片上。