MongoDB插入引发重复密钥

2024-09-28 23:27:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试向emptymongodb集合进行大容量插入时遇到以下错误。

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: 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)

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

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: cmdDistros.locDistro.$id dup key: { : 0 }

只在我的数据库中插入了一个文档。

我完全被难住了,有人知道为什么会这样吗?


Tags: keyin文档idforrangedatabaseentries
3条回答

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

Getting "err" : "E11000 duplicate key error when inserting into mongo using the Java driver

你需要知道你的条目列表有很多对条目dict的引用,所以当PyMongo设置条目[0][“u id”]时,所有其他条目都会得到相同的id。(事实上,PyMongo会遍历设置每个条目的id的列表,因此,所有条目的结尾都会有finalid。)一个快速的解决方法是:

entries.append(entry.copy())

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

确保每次插入后清除变量“entries”。

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

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

或者

从听写中删除id。例如:

del my_dict['_id'] 

相关问题 更多 >