首页 > 解决方案 > 数组字段上的Mongodb E11000重复键错误

问题描述

我有一个关于猫鼬模式的快速问题。这是代码:https ://i.ibb.co/Db8xPMw/5555.png 我试图创建一个没有属性“工作”的文档。它在第一次工作,但它并没有开始工作,第二次我再次做同样的事情。你有什么主意吗?基本上,我创建了两个没有“工作”属性的文档,这会导致重复键错误。但是,我没有设置 unqiue: true 。

错误 :

"errmsg" : "E11000 duplicate key error collection: test.user index work_1 dup key: { : null }

标签: javascriptnode.jsmongodbmongoose

解决方案


从消息中它说您的集合有一个名称work_1可能在字段上的索引work,由于您创建了一个没有work字段的文档,那么基本上您不能在同一个集合中创建另一个没有工作字段的文档,导致两个文档没有work字段或即使work值等于null或相同的字段也不能存在,因为它违反了唯一的约束策略(它说dup key : { : null})!唯一索引可以通过猫鼬模式创建,也可以通过在数据库上手动运行查询来创建。

Ref :Unique Index and Missing Fieldindex-unique中搜索

因此,您需要使用dropIndex删除现有索引,然后在需要时使用createIndex重新创建它。如果至少一个现有文档在您创建索引时具有该索引字段的数组值,或者即使插入了一个数组值,MongoDB 会自动将创建的索引转换为index-multikey (多键索引 - 数组字段上的索引)未来的那个领域。

通过代码 - 删除索引yourSchema.dropIndex({yourFieldName: 1})&&创建索引yourSchema.index({yourFieldName : 1})

注意:以防万一你想在unique indexes这个问题的类似情况下有某些标准,在某些文档中可能缺少索引字段但它不应该被视为重复插入,那么你可以使用部分索引(搜索具有唯一约束的部分索引),它只会索引work字段存在的文档。

部分索引的前:-

db.yourCollectionName.createIndex(
   { work: 1 },
   { unique: true, partialFilterExpression: { work: { $exists: true } } }
)

参考: 猫鼬索引


推荐阅读