首页 文章

MongoDB插入引发重复键错误

提问于
浏览
5

尝试将批量插入到空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)

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

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

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

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

3 回答

  • 4

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

    entries.append(entry.copy())
    

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

  • 16

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

  • 1

    Make sure variable 'entries' is cleared after every insert.

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

    Clear the dict variable in top of the loop statements.

    要么

    Remove _id from the dict. Eg:

    del my_dict['_id']
    

相关问题