插入期间: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
是在循环外部定义的,因此每次后续循环都使用_id
的same 值。
解决方案:
-
删除密钥_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 重复键错误索引引起?