分片集合需要支持 分片键的索引。该索引可以是基于分片键的索引,也可以是复合索引(其中分片键是索引的前缀)。
如果集合为空,
sh.shardCollection()会在分片键上创建索引(如果该索引尚不存在)。如果集合不为空,则必须先创建索引,然后才能使用
sh.shardCollection()。如果使用
sh.reshardCollection()对集合重新分片,则无需事先在新分片键上创建索引。重新分片操作会自动构建所需的索引。要学习;了解更多信息,请参阅对集合重新分片过程。
如果索引是唯一支持分片键的非隐藏索引,则无法将其删除或隐藏。
从 MongoDB 7.0.3、6.0.12 和 5.0.22 开始,您可以删除 哈希分片键的索引。如需有关详细信息,请参阅删除哈希分片键索引。
Unique Indexes
MongoDB可以对范围分片键索引实施唯一性约束。对分片键使用唯一索引可实施整个键组合的唯一性,而不是分片键的各个组件的唯一性。
对于范围分片集合,只有以下索引是唯一的:
重要
当 _id 字段不是分片键时,分片集群不会在整个集群中对 _id 字段执行唯一性约束。
如果 _id字段不是分片键,则唯一性约束仅应用于存储文档的分片。这意味着两个或多个文档可以具有相同的 _id 值,前提是它们出现在不同的分片上。
示例,考虑一个分片键为 {x:
1}的分片的集合,它跨越两个分片 A 和 B。由于 _id 键不是分片键,因此该集合可能在分片A 中包含 _id 值为 1 的文档以及分片B 中另一个 _id 值为 1 的文档。
如果 _id字段不是分片键, MongoDB希望应用程序确保各分片中 _id 值的唯一性,示例,使用唯一标识符填充 _id字段。
唯一索引约束意味着:
对于要分片的集合,如果该集合有多个唯一索引,则无法对该集合分片,除非分片键是所有唯一索引的前缀。
对于已分片的集合,除非包含分片键作为前缀,否则无法在其他字段上创建唯一索引。
唯一索引为缺少索引字段的文档存储空值;即缺少的索引字段将被视为
null索引键值的另一个实例。有关详细信息,请参阅唯一单字段索引中的缺失文档字段。
要确保分片键值的唯一性,请将unique参数作为true传递给sh.shardCollection()方法:
如果集合为空,
sh.shardCollection()会在分片键上创建唯一索引(条件是此种索引尚不存在)。如果集合不为空,则必须先创建索引,然后才能使用
sh.shardCollection()。
尽管可以有以分片键为前缀的唯一复合索引,但如果使用unique参数,则集合必须在分片键上有唯一索引。
不能在哈希索引上指定唯一约束。
要保持分片键字段的唯一性,请参阅任意字段的唯一性约束。