2013-07-08 39 views
4

嘗試向空的 mongodb集合執行批量插入時出現以下錯誤。MongoDB插入引發重複密鑰錯誤

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 }

並且只有一個文檔被插入到我的數據庫中。

我完全難住,任何人都有答案,爲什麼這可能會發生?

+0

我不知道發生了什麼,但問題始終總算修復自己...我只是一遍又一遍地運行代碼,它只是工作....怪異..如果任何人有一個解釋,我仍然想知道,以防萬一它再次發生......順便說一下,條目.append行是一個錯字,實際的位置與上面的它是一致的。 – RoboCop87

+0

集合中是否還有其他索引定義? – WiredPrairie

+0

無。只是_id。我想使用ensure_index在x y和標題上創建索引,但它們不是唯一的,所以我不確定這是否可行。無論在這一點上只有_id被索引。 – RoboCop87

回答

10

您需要了解您的條目列表中有一堆對一個條目字典的引用。所以當PyMongo設置條目[0] ['_ id']時,所有其他條目都會得到相同的_id。 (事實上​​,PyMongo將通過列表設置每個條目的_id迭代,因此,所有的參賽作品將有最終 _id結尾。)速戰速決是:

entries.append(entry.copy()) 

這僅僅是一個淺拷貝,但在你分享的代碼中,我相信這足以解決你的問題。

+0

對不起,我從來沒有接受過! – RoboCop87

+1

條目正在每個循環上創建,它們如何指向同一個對象?我認爲這不是正確的答案 –