唯一索引可确保索引字段不会存储重复值;即对索引字段实施唯一性。默认情况下,MongoDB 在创建集合时会在_id字段上创建唯一索引。
新的内部格式
从MongoDB 4.2开始,对于4.2(或更高版本)的featureCompatibilityVersion(fCV),MongoDB使用新的内部格式来存储与早期MongoDB版本不兼容的唯一索引。新格式适用于现有的唯一索引以及新创建/重建的唯一索引。
要创建唯一索引,请使用选项设置为的db.collection.createIndex()
方法。unique
true
对于副本集和分片群集,使用滚动过程创建唯一索引要求您在该过程中停止对集合的所有写操作。如果在此过程中无法停止对集合的所有写操作,请不要使用滚动过程。而是通过以下方式在集合上构建唯一索引:
db.collection.createIndex()
在主数据库上发布副本集,或者db.collection.createIndex()
在上
mongos
为分片群集发行。唯一约束适用于集合中的单独文档。也就是说,唯一索引可防止单独的文档的索引键具有相同的值。
因为该约束适用于单独的文档,所以对于唯一的 多键索引,文档可能具有导致重复索引键值的数组元素,只要该文档的索引键值不重复另一个文档的索引键值即可。在这种情况下,重复的索引条目仅被插入索引一次。
例如,考虑包含以下文档的集合:
在a.loc
和上创建唯一的复合多键索引a.qty
:
如果集合中没有其他文档的索引关键字值为,则唯一索引允许将以下文档插入到集合中。{ "a.loc": "B", "a.qty": null }
如果文档在唯一索引中没有索引字段的值,则索引将为此文档存储一个空值。由于存在独特的约束,MongoDB将只允许一个缺少索引字段的文档。如果有多个文档没有索引字段的值或缺少索引字段,则索引构建将失败,并出现重复的键错误。
例如,一个集合在上具有唯一索引x
:
x
如果集合尚不包含缺少该字段的文档,则唯一索引允许插入
不包含该字段的文档x
:
但是,x
如果集合中已经包含缺少该字段的文档,则在插入没有该字段的文档时,唯一索引错误x
:
由于违反了对字段值的唯一约束,因此该操作无法插入文档x
:
也可以看看
3.2版中的新功能。
部分索引仅索引集合中符合指定过滤器表达式的文档。如果同时指定
partialFilterExpression
和约束,则唯一约束仅适用于满足过滤器表达式的文档。
如果文档不满足过滤条件,则具有唯一性约束的部分索引不会阻止不符合唯一性约束的文档的插入。有关示例,请参见 具有唯一约束的部分索引。
您不能在哈希索引上指定唯一约束。
对于远程分片集合,只有以下索引可以是 唯一的:
分片键上的索引
默认_id
索引;不过,该_id
指数仅实施每碎片的唯一性约束,如果该_id
字段是不是分片键或片键的前缀。
唯一性与_id
索引
如果该_id
字段不是分片密钥或分片密钥的前缀,则_id
索引仅对每个分片强制执行唯一性约束,而不对每个分片实施唯一性约束。
例如,考虑一个跨越两个分片A和B的分片集合(具有分片键)。由于该键不是分片键的一部分,因此该集合中可能有一个文档的值在分片A中,而另一个文档的
值在分片B中。 。{x:
1}
_id
_id
1
_id
1
如果该_id
字段既不是分片密钥,也不是分片密钥的前缀,则MongoDB希望应用程序在_id
各个分片上强制值的唯一性。
唯一的索引约束意味着: