2011-12-26 71 views
8

我有一個簡單的「用戶」集合裏面,現在我只有2個文件。E11000重複鍵錯誤指數:MongoDb異常錯誤

{ 
    "_id": ObjectId("4ef8e1e41d41c87069000074"), 
    "email_id": { 
     "0": 109, 
     "1": 101, 
     "2": 64, 
     "3": 97, 

{ 
    "_id": ObjectId("4ef6d2641d41c83bdd000001"), 
    "email_id": { 
     "0": 109, 
     "1": 97, 
     "2": 105, 
     "3": 108, 

現在,如果我嘗試創建一個新的指數{獨特:真正}上EMAIL_ID場,MongoDB的投訴我「E11000重複鍵錯誤指數:db.users $ EMAIL_ID DUP鍵:{46} 」。即使在指定{dropDups:true}後,我也會得到相同的錯誤,但是我不認爲這是這種情況,因爲兩個文檔都存儲有不同的電子郵件ID。

我不確定這裏發生了什麼,任何指針將不勝感激。

編輯:證件的完整視圖:

{ 
"_id": ObjectId("4ef8e1e41d41c87069000074"), 
"email_id": { 
"0": 109, 
"1": 101, 
"2": 64, 
"3": 97, 
"4": 98, 
"5": 104, 
"6": 105, 
"7": 110, 
"8": 97, 
"9": 118, 
"10": 115, 
"11": 105, 
"12": 110, 
"13": 103, 
"14": 104, 
"15": 46, 
"16": 99, 
"17": 111, 
"18": 109 
} 
} 

{ 
"_id": ObjectId("4ef6d2641d41c83bdd000001"), 
"email_id": { 
"0": 109, 
"1": 97, 
"2": 105, 
"3": 108, 
"4": 115, 
"5": 102, 
"6": 111, 
"7": 114, 
"8": 97, 
"9": 98, 
"10": 104, 
"11": 105, 
"12": 110, 
"13": 97, 
"14": 118, 
"15": 64, 
"16": 103, 
"17": 109, 
"18": 97, 
"19": 105, 
"20": 108, 
"21": 46, 
"22": 99, 
"23": 111, 
"24": 109 
} 
} 

有一對夫婦更喜歡 「DISPLAY_NAME」, 「registered_since」 等領域我從省略上面的顯示(我不認爲他們在拋出的錯誤中有任何作用,如果你仍然需要它們,我可以在這裏粘貼整個文檔)

我正在使用erlang mongodb driver與我的mongo實例進行通信。所有可以看到的字段都保存爲二進制字節,這就是爲什麼你在文檔中看到這樣奇怪的email_id。

注:二進制字節格式不被我的代碼邏輯所迫,我非常通字符串我BSON文件裏面EMAIL_ID,但我總是最後看到我的數據的二進制字節。 (可能是因爲如何編寫erlang mongodb驅動程序,因爲我的find(),find_one()和其他查詢按預期工作,即使字段保存爲二進制字節也沒有調查)

編輯:> db .users.findOne()

{ 
"_id" : ObjectId("4ef6d2641d41c83bdd000001"), 
"email_id" : [ 
    109, 
    97, 
    105, 
    108, 
    115, 
    102, 
    111, 
    114, 
    97, 
    98, 
    104, 
    105, 
    110, 
    97, 
    118, 
    64, 
    103, 
    109, 
    97, 
    105, 
    108, 
    46, 
    99, 
    111, 
    109 
], 
"display_name" : [ 
    65, 
    98, 
    104, 
    105, 
    110, 
    97, 
    118, 
    43, 
    83, 
    105, 
    110, 
    103, 
    104 
], 
"provider" : [ 
    106, 
    97, 
    120, 
    108, 
    46, 
    105, 
    109 
], 
"provider_id" : [ ] 
} 
+1

向我們展示完整文檔。 – 2011-12-26 21:28:37

+0

爲什麼你的電子郵件看起來很奇怪? – 2011-12-26 21:29:13

+0

檢查其他文檔... – 2011-12-26 21:51:06

回答

5

當MongoDB的索引的陣列字段,它實際上索引陣列中的單個元件。這是爲了有效地支持查詢,尋找一個數組的特定元素,比如:

db.users.find({email_id: 46}) 

由於這email_id(46)存在於兩個文件,也有你的唯一索引重複鍵。

我不確定爲什麼你會得到這個錯誤,如果你有dropDups: true設置...你可以顯示一個代碼示例與你如何調用createIndex?您還應該嘗試dropDups: 1,因爲MongoDB在此上下文中錯誤地將1true視爲不同(請參閱https://jira.mongodb.org/browse/SERVER-4562)。

+0

我認爲這的確是這樣的情況dropDups從mongo shell工作,它從mongorock管理面板失敗我讀了erlang bson文檔,它說: 「注意,string()將被解釋爲一個整數數組,你必須提供字符串爲utf8 binary,見下文。」 - 在這種情況下,我無法將我的email_id保存爲字符串,因爲我希望email_id字段作爲唯一字符串整個字符串,沒有每個字符明智的唯一性要求紅外發光二極管。這真是一團糟,我認爲它來自erlang mongodb驅動程序,如果我將我的email_id字段作爲原子傳遞,它將保留爲完整字符串n,而不是像上面那樣使用char明智數組。 – 2011-12-28 09:35:10

+1

啊,我明白了。所以這些實際上是錯誤編碼爲整數數組的字符串?在這種情況下,您應該確保文檔正在推薦關於UTF8二進制文件的內容,以便它們在MongoDB中保存爲字符串。另外,你正在使用哪個驅動程序? – dcrosta 2011-12-28 12:34:40

+0

我使用的是由tuony(https://github.com/TonyGen/mongodb-erlang)構建的erlang mongodb驅動程序......實際上,所有需要做的事情都是將字符串作爲utf8二進制文件傳遞,如果它們必須保存爲字符串... if作爲erlang列表傳遞,它們將如上所示存儲在片段中,這將導致唯一的密鑰創建錯誤。我認爲這個問題可以被標記爲接近。它更關心的是仔細閱讀文檔,並將字符串作爲utf8二進制文件 – 2011-12-29 07:05:28

0

對於有此問題的其他人,請檢查您的mongo版本db.version()。如果您正在運行Mongo 3並試圖使用dropDups來清除重複項,它將會失敗,併爲您提供此錯誤。