【问题标题】:During insert : E11000 duplicate key error index插入期间:E11000 重复键错误索引
【发布时间】: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 字段,驱动程序或数据库将自动分配一个。无论哪种方式,它都是独一无二的。

标签: javascript node.js mongodb


【解决方案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 值。

解决方案:

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

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 2019-07-11
    • 2016-10-31
    • 1970-01-01
    • 2017-01-03
    • 2014-01-06
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多