mongoDB中的索引数组/子对象导致重复键错误
Posted
技术标签:
【中文标题】mongoDB中的索引数组/子对象导致重复键错误【英文标题】:Indexing array/subobject in mongoDB causes duplicate key error 【发布时间】:2016-06-28 23:27:31 【问题描述】:我有一个集合,其中有一个 _children
属性,如下所示:
_children:
videoTags: [ id: '1', name: 'one', id: '2', name: 'two' ],
,
a: 10
由于我将在 videoTags 中搜索,因此我创建了一个索引:
> db.test4.createIndex( "_children.videosTags.id" : 1 , "unique" : true );
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
问题是,我无法再将 anything 添加到该表中,因为我收到重复索引错误。以下是如何重现它:
第 1 步:插入到集合中
db.test4.insert(a:20)
WriteResult( "nInserted" : 1 )
db.test4.createIndex( "_children.videosTags.id" : 1 , "unique" : true );
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
db.test4.insert(a:30)
WriteResult(
"nInserted" : 0,
"writeError" :
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: wonder_1.test4.$_children.videosTags.id_1 dup key: : null "
)
我认为这里的问题是已经一条记录没有定义_children.videoTags.id。
但是,我所期望的是 if videoTags.id 指定的行为,它需要是唯一的。取而代之的是,一个空的密钥被视为“已获取”密钥。
我在做什么这是愚蠢的错误?
如果您不将unique
设置为true
,这将起作用,但我觉得我需要真正修复它...
【问题讨论】:
这将是因为另一个文档已经有一个空数组(或至少一个没有"id"
字段的元素。您可以使用"sparse"
,或确保所有数组元素都有一个@987654331 @ 字段。将您知道将在数组元素上放置的 "unique"
索引(即使您真的想要一个唯一的 id 集合)可能会充满问题。通常不建议这样做。
感谢您的回答——就是这样!
【参考方案1】:
可能有两个原因。
集合中可能存在具有相同_children.videosTags.id
的其他文档
很可能不止一个文档可能缺少_children.videosTags.id"
或具有空值。
当您创建unique
键时,null 或空值会给您带来困难。解决方案是创建 sparse
索引,如果您的 MongoDB 版本是 3.2+,则创建部分索引。部分索引见documentation。
【讨论】:
以上是关于mongoDB中的索引数组/子对象导致重复键错误的主要内容,如果未能解决你的问题,请参考以下文章
E11000 mongodb mongoose 中的重复键错误索引
E11000 mongodb mongoose 中的重复键错误索引