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

第 3 步:再次尝试插入

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中的索引数组/子对象导致重复键错误的主要内容,如果未能解决你的问题,请参考以下文章

mongodb mongoose中的重复键错误索引

E11000 mongodb mongoose 中的重复键错误索引

E11000 mongodb mongoose 中的重复键错误索引

E11000 mongodb mongoose 中的重复键错误索引

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

插入期间:E11000 重复键错误索引