唯一索引
最后更新于
最后更新于
在本页面
唯一索引确保索引字段不会存储重复值;例如,强制索引字段的唯一性。默认情况下,MongoDB在创建集合期间在字段上创建一个唯一的索引。
新的内部格式
从MongoDB 4.2开始,对于4.2(或更高版本)的(),MongoDB使用一种新的内部格式来存储与早期MongoDB版本不兼容的唯一索引。新格式适用于现有的唯一索引以及新创建/重建的唯一索引。
要创建一个唯一的索引,使用方法,并将unique
选项设置为true
。
例如,要在members
集合的user_id
字段上创建一个唯一的索引,在 shell中使用以下操作:
您还可以在上强制执行唯一约束。如果您在上使用唯一约束,那么MongoDB将对索引键值的_组合_执行惟一性。
例如,要在members
集合的groupNumber
, lastname
和firstname
字段上创建一个唯一的索引,在 shell中使用以下操作:
创建的索引强制groupNumber
、lastname
和firstname
值的_组合_的唯一性。
再举一个例子,考虑一个包含以下文档的集合:
唯一索引允许将以下文档插入到集合中,因为索引强制a.loc
和a.qty
值组合的唯一性:
也可以看看:
唯一约束适用于集合中的不同文档。也就是说,唯一索引防止_单独的_文档对索引键具有相同的值。
例如,考虑一个包含以下文档的集合:
在a.loc
和a.qty
上创建唯一的复合多键索引:
如果集合中的其他文档的索引 key value 为{ "a.loc": "B", "a.qty": null }
,则唯一索引允许将以下文档插入到集合中。
如果文档在唯一索引中没有索引字段的值,索引将为该文档存储空值。由于唯一的约束,MongoDB将只允许一个没有索引字段的文档。如果有多个文档没有索引字段的值或缺少索引字段,索引构建将失败,并出现重复键错误。
例如,一个集合在x
上有一个唯一的索引:
如果集合中没有包含缺少x
字段的文档,唯一索引允许插入没有x
字段的文档:
但是,如果集合中已经包含了一个没有字段x
的文档,则在插入一个没有字段x
的文档时出现唯一的索引错误:
由于违反了字段x
值的唯一约束,操作无法插入文档:
也可以看看:
3.2版本新增.
分片键上的索引
默认_id
索引;不过,该_id
指数仅实施每碎片的唯一性约束**,如果该_id
字段是不是**分片键或片键的前缀。
唯一性和
_ID
索引
如果_id
字段不是分片键或分片键的前缀,_id
索引只对每个分片强制唯一性约束,而对各个分片强制而不是。
唯一的索引约束意味着:
对于要分片的集合,如果该集合有其他唯一索引,则不能对该集合进行分片。
对于已经分片的集合,不能在其他字段上创建唯一索引。
创建一个独特的复合索引在a.loc
和a.qty
:
和
如果集合已经包含了违反索引的唯一约束的数据,MongoDB不能在指定的索引字段上创建一个。
不能在上指定唯一的约束。
对于复制集和分片集群,使用创建唯一索引需要在过程中停止对集合的所有写操作。如果不能在过程中停止对集合的所有写操作,则不要使用滚动过程。相反,在集合上建立你的唯一索引:
在主数据库上发布副本集,
在分片群集上发出。
因为约束适用于单独的文档,一个独特的索引,一个文档可能数组元素,导致重复索引键值,只要文档不重复的索引键值的另一个文档。在本例中,重复索引条目只插入索引一次。
部分索引只索引集合中满足指定筛选器表达式的文档。如果您同时指定了partialFilterExpression和一个,唯一约束只适用于满足筛选器表达式的文档。
如果文档不满足筛选条件,则具有唯一约束的部分索引不会阻止插入不满足唯一约束的文档。例如,请参阅。
您不能在上指定唯一的约束。
对于一个范围分片集合,只有以下索引可以是:
一个,其中片键是一个