17

尝试将批量插入到的mongodb 集合中时出现以下错误。

pymongo.errors.DuplicateKeyError: E11000 重复键错误索引: cmdDistros.locDistro.$ id dup key: { : ObjectId('51dac9d0c74cd81acd85c0fd') }

我在创建任何文档时都没有指定 _id,所以 mongodb 应该正确创建唯一索引吗?这是我使用的代码:

#Populate database with uniform distribution
            entries = []
            for coor in freeIndices:
                for theta in range(360):
                    entry = {"x" : coor[0], "y" : coor[1], "heading" : theta}
                    for i in range(numData):
                            entry["data" + str(i)] = 1./numData
                    entries.append(entry)
            print "Entries created, loading into database..."

            locDistro.insert(entries)

从 mongoDB 手中夺走命运,我尝试使用以下方法创建自己的索引:

#Populate database with uniform distribution
            entries = []
            idNum = 0
            for coor in freeIndices:
                for theta in range(360):
                    print idNum
                    entry = {"_id" : idNum, "x" : coor[0], "y" : coor[1], "heading" : theta}
                    idNum += 1
                    for i in range(numData):
                            entry["data" + str(i)] = 1./numData
                    entries.append(entry)
            print "Entries created, loading into database..."

            locDistro.insert(entries, manipulate = False)

打印语句显示文档创建时的每个 idnum,它们都是唯一的,并且按预期递增。但是在插入时,我收到了错误:

pymongo.errors.DuplicateKeyError: E11000 重复键错误索引: cmdDistros.locDistro.$ id dup key: { : 0 }

并且只有一个文档被插入到我的数据库中。

我完全被难住了,有人知道为什么会发生这种情况吗?

4

5 回答 5

28

您需要了解您的条目列表有一堆对一个条目字典的引用。因此,当 PyMongo 设置条目[0]['_id'] 时,所有其他条目都会获得相同的 _id。(实际上,PyMongo 将遍历设置每个条目的 _id 的列表,因此所有条目的末尾都会有最终的_id。)快速解决方法是:

entries.append(entry.copy())

这只是一个浅拷贝,但在您共享的代码中,我相信这足以解决您的问题。

于 2013-07-09T17:50:08.347 回答
8

删除密钥"_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)

获取“错误”:“使用 Java 驱动程序插入 mongo 时出现 E11000 重复键错误

于 2017-03-30T15:28:27.007 回答
3

insert_one()我也有同样的错误使用insert_many()

我的解决方案是,update_one()upsert=True

  doc = {a: 1, b:2, x:{xx:"hello",yy:"world"}}
  db.collection.update_one(doc,{'$set':doc},upsert=True)

这对我有用:-)

于 2020-01-03T12:27:39.790 回答
1

确保在每次插入后清除变量“条目”。

问题是 PyMongo 会在文档中注入一个_id字段,如果_id字段不存在,则在插入之前(_id总是在客户端生成)。这意味着第一次通过循环_id是由 insert 方法添加的。由于“条目”是在外部定义的,因此每次后续循环都使用相同的_id值。

清除循环语句顶部的 dict 变量。

或者

从字典中删除 _id。例如:

del my_dict['_id'] 
于 2018-07-16T13:25:50.817 回答
0

解决方案:在循环中声明 dict() 项,然后填充并插入它。我在使用 pymongo的insert_one () 时遇到了类似的问题。我通过在循环中声明dict()项解决了我的问题。这是您的代码的工作版本:

#Populate database with uniform distribution
            entries = []
            for coor in freeIndices:
                for theta in range(360):
                    entry = dict()
                    entry['x'] = coor[0]
                    entry['y'] = coor[1]
                    entry['heading'] = theta
             
                    for i in range(numData):
                            entry['data' + str(i)] = 1./numData
                    entries.append(entry)
            print "Entries created, loading into database..."

            locDistro.insert(entries)
于 2020-10-08T07:07:57.157 回答