唯一索引
在本页面
唯一索引确保索引字段不会存储重复值;例如,强制索引字段的唯一性。默认情况下,MongoDB在创建集合期间在 _id 字段上创建一个唯一的索引。
新的内部格式
从MongoDB 4.2开始,对于4.2(或更高版本)的 featureCompatibilityVersion ( fCV ),MongoDB使用一种新的内部格式来存储与早期MongoDB版本不兼容的唯一索引。新格式适用于现有的唯一索引以及新创建/重建的唯一索引。
创建唯一索引
要创建一个唯一的索引,使用
db.collection.createIndex()
方法,并将
unique
选项设置为
true
。
单个字段上的唯一索引
例如,要在
members
集合的
user_id
字段上创建一个唯一的索引,在
mongo
shell中使用以下操作:
独特的复合索引
您还可以在 复合索引 上强制执行唯一约束。如果您在 复合索引 上使用唯一约束,那么MongoDB将对索引键值的_组合_执行惟一性。
例如,要在
members
集合的
groupNumber
,
lastname
和
firstname
字段上创建一个唯一的索引,在
mongo
shell中使用以下操作:
创建的索引强制
groupNumber
、
lastname
和
firstname
值的_组合_的唯一性。
再举一个例子,考虑一个包含以下文档的集合:
创建一个独特的复合
multikey
索引在
a.loc
和
a.qty
:
唯一索引允许将以下文档插入到集合中,因为索引强制
a.loc
和
a.qty
值组合的唯一性:
也可以看看:
行为
限制
如果集合已经包含了违反索引的唯一约束的数据,MongoDB不能在指定的索引字段上创建一个 唯一索引 。
不能在 hashed索引 上指定唯一的约束。
在复制集和分片集群上建立唯一索引
对于复制集和分片集群,使用 滚动过程 创建唯一索引需要在过程中停止对集合的所有写操作。如果不能在过程中停止对集合的所有写操作,则不要使用滚动过程。相反,在集合上建立你的唯一索引:
-
db.collection.createIndex()
在主数据库上发布副本集, -
db.collection.createIndex()
在分片mongos
群集上发出。
跨不同文档的唯一约束
唯一约束适用于集合中的不同文档。也就是说,唯一索引防止_单独的_文档对索引键具有相同的值。
因为约束适用于单独的文档,一个独特的 多键 索引,一个文档可能数组元素,导致重复索引键值,只要文档不重复的索引键值的另一个文档。在本例中,重复索引条目只插入索引一次。
例如,考虑一个包含以下文档的集合:
在
a.loc
和
a.qty
上创建唯一的复合多键索引:
如果集合中的其他文档的索引 key value 为
{ "a.loc": "B", "a.qty": null }
,则唯一索引允许将以下文档插入到集合中。