MongoDB插入引发重复键错误

Rob*_*p87 7 python database mongodb pymongo

尝试将批量插入到 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)
Run Code Online (Sandbox Code Playgroud)

考虑到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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

我完全难过,任何人都有答案为什么会发生这种情况?

A. *_*vis 19

您需要了解您的条目列表有一堆对一个条目dict 的引用.因此,当PyMongo设置条目[0] ['_ id']时,所有其他条目都获得相同的_id.(事实上​​,PyMongo将遍历列表设置每个条目的_id,因此所有条目将在最后具有最终的 _id.)快速修复将是:

entries.append(entry.copy())
Run Code Online (Sandbox Code Playgroud)

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

  • 每个循环都会创建条目,它们如何指向同一个对象?我认为这不是正确答案 (2认同)

小智 6

删除密钥"_id"

for i in xrange(2): 
    doc['i'] = i 
    if '_id' in doc: 
        del doc['_id'] 
    collection.insert(doc)
Run Code Online (Sandbox Code Playgroud)

或者手动创建一个新的:

from bson.objectid import ObjectId

for i in xrange(2): 
    doc['i'] = i 
    doc['_id'] = ObjectId() 
    collection.insert(doc)
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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)
Run Code Online (Sandbox Code Playgroud)

这对我有用:-)