MongoDb在并非所有文档中的字段上创建唯一索引[重复]

Posted

技术标签:

【中文标题】MongoDb在并非所有文档中的字段上创建唯一索引[重复]【英文标题】:MongoDb create unique index on a field not in all documents [duplicate] 【发布时间】:2019-02-05 05:57:56 【问题描述】:

我在生产 Mongo 数据库中添加了一个新字段,需要在其上创建唯一索引。如果我尝试创建一个,它会不断抛出“异常:E11000 重复键错误索引:”。

我了解没有新字段的文档具有 null 值,这会导致违反唯一性。我该怎么做?

【问题讨论】:

您需要确保所有文档都有具有唯一值的新字段。这意味着您需要更新所有这些。 @Khang,害怕这种方法,但似乎这是唯一的解决方案:-) 【参考方案1】:

您可以使用Sparse Index,它仅包含具有索引字段的文档的条目。示例:

db.collection.createIndex(  "newIndex": 1 ,  sparse: true  )

【讨论】:

> 如果您使用的是 MongoDB 3.2 或更高版本,部分索引应优先于稀疏索引。【参考方案2】:

您可以创建partial index,以便唯一约束仅适用于存在该字段的文档。例如

db.collection.createIndex(
    newField: 1 ,
    unique: true, partialFilterExpression:  newField:  $exists: true   
)

【讨论】:

仍然出现同样的错误:'E11000 重复键错误索引:db.trips.$reservationId_-1 dup key: : null ' 因此您拥有该字段存在且明确为null 的文档。调整partialFilterExpression 条件以满足您的数据。 @risabh agarwal 回答有效。这是文档:docs.mongodb.com/manual/core/index-sparse @Kihats,当然可以。您所指的页面有一个重要的黄色框。值得一读。

以上是关于MongoDb在并非所有文档中的字段上创建唯一索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Indexes

Mongo基础 索引的使用

mongoDB 3.2中的唯一索引忽略空值

mongodb 索引唯一性约束

MongoDB索引的唯一性值

MongoDB索引