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}?
非常感谢。
答案 0 :(得分:5)
这种限制的原因是分片必须能够检查重复项而不必与其他分片通信。
这意味着必须清楚它所残留的碎片的索引的每个可能值。碎片只能确定当碰撞文档也存储在自身时,值才是唯一的。
这意味着当分片键只是索引的一部分时是可以的,但是当索引只是分片键的一部分时则不行。
对于您的示例,分片键 A和B可以使用,但C和D不会。当场景C或D中的分片会收到字段a,b和c与其所具有的任何内容不匹配的文档时,仍然可能存在a,b和c上具有相同值的文档但是d的值不同在另一个碎片上。