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

Posted

技术标签:

【中文标题】插入期间:E11000 重复键错误索引【英文标题】:During insert : E11000 duplicate key error index 【发布时间】:2013-04-14 13:22:58 【问题描述】:

我正在使用 mongojs 和 Node.js 在 mongodb 中插入文档。 它是一个 REST API,只有一个 mongojs 实例(带有本机驱动器)。每次都有一个 api 调用,使用 SAME mongojs 对象来执行 mongodb 操作。现在,尝试插入文档时出现以下错误。


name: "MongoError"
err: "E11000 duplicate key error index: testdb.userComment.$_id_ dup key:  :    ObjectId('51727190bb4ab52a80024c09') "
code: 11000
n: 0
connectionId: 225
ok: 1

文档始终是唯一的 我试过db.userComment.getIndexs(),它显示索引在 _id 上。谁能帮我解决这个问题?

【问题讨论】:

_id 在 MongoDB 中必须是唯一的。如果您有一个新文档,最简单的方法是不设置_id 字段,驱动程序或数据库将自动分配一个。无论哪种方式,它都是独一无二的。 【参考方案1】:

我不确定它是否是正确的修复,但每次插入文档时,我都会明确地创建一个新的 ObjectID,而不是将命运留给 mongodb 驱动程序。我使用了以下代码

commentData._id = require('mongodb').BSONPure.ObjectID();

【讨论】:

这是对您问题的回答,还是有关您问题的其他信息? 这里也有:var id=require('mongodb').ObjectID() 您要创建一个新的吗?你看过分配的内容吗?前面需要“新”吗? @wiredprairie 我使用上面的代码进行了修复。但是,我无法理解“为什么在这种情况下 mongodb 没有创建唯一的 _id” @AsyaKamsky 是的,我正在创建一个新的。我发现 _id 缓存在某处,并且在我插入新记录时正在使用相同的内容。【参考方案2】:

这个问题似乎与这个问题重复: Getting "err" : "E11000 duplicate key error when inserting into mongo using the Java driver

我找到了答案on this page。我猜你的代码看起来像这样(非常简化)?:

doc =  
for i in xrange(2): 
    doc['i'] = i 
    collection.insert(doc) 

问题是 PyMongo 会在文档中注入一个 _id 字段,如果 _id 字段不存在,然后再插入它(_id 总是使用 10gen 驱动程序生成客户端)。这意味着第一次通过循环_id 是由插入方法添加的。由于doc 是在循环外部定义的,因此每次后续循环都使用_idsame 值。

解决方案:

    删除密钥_id
for i in xrange(2): 
    doc['i'] = i 
    if '_id' in doc: 
        del doc['_id'] 
    collection.insert(doc)
    或者手动创建一个新的:
from bson.objectid import ObjectId 
for i in xrange(2): 
    doc['i'] = i 
    doc['_id'] = ObjectId() 
    collection.insert(doc)

【讨论】:

以上是关于插入期间:E11000 重复键错误索引的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:E11000 重复键错误集合:annka.transactions 索引:assets_1 重复键::null

MongoError:E11000 重复键错误集合:myFirstDatabase.tours 索引:rating_1 重复键: rating:null

Mongoose - 由 :: 11000 E11000 重复键错误索引引起?

Mongoose - 由 :: 11000 E11000 重复键错误索引引起?

Mongoose + Expressjs - E11000 重复键错误索引?

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