2013-06-05 94 views
2

我試圖在MongoDB中的一組字段上添加唯一索引。並非所有這些字段都可用於所有文檔,我只想索引那些包含所有字段的字段。在MongoDB中添加唯一索引,忽略空值

所以,我試圖運行這個命令:

db.mycollection.ensureIndex({date:1, type:1, reference:1}, {sparse: true, unique: true}) 

但我上錯過「類型」字段的字段得到一個錯誤E11000 duplicate key error index(有很多人,他們是重複的,但我只是想忽略它們)。

是否有可能在MongoDB中或有一些解決方法?

+0

稀疏手段不索引缺少您要索引的字段的文檔。這對複合索引沒有意義,除非您想跳過沒有設置任何字段的文檔。 –

+0

@AsyaKamsky是的,我知道它是如何工作的,我正在尋找解決這個限制的解決方法。 – sashkello

+0

已經有一個同樣的問題提交的bug:https://jira.mongodb.org/browse/SERVER-2193 –

回答

3

還有誰想要這個功能多的人因爲沒有辦法解決這個,我會建議表決插入向上特徵請求吉拉門票jira.mongodb.org:

需要注意的是,因爲785將提供一種方法來執行此功能,2193被標記爲「不會修復」,所以它可能是更富有成效投票起來,自己的意見加入785

+0

是的,我沒有在這裏收到明確的答案後發現它。我會接受這個,因爲雖然upsert是一個可行的選擇,但它只是一種替代方案,並不真正模仿所需的行爲。 – sashkello

0

唯一性,你可以保證,使用upsert操作,而不是做插入。這將確保,如果某些文件已經存在,那麼它會更新,或者如果文件不存在

test:Mongo > db.test4.ensureIndex({ a : 1, b : 1, c : 1}, {sparse : 1}) 

test:Mongo > db.test4.update({a : 1, b : 1}, {$set : { d : 1}}, true, false) 
test:Mongo > db.test4.find() 
{ "_id" : ObjectId("51ae978960d5a3436edbaf7d"), "a" : 1, "b" : 1, "d" : 1 } 
test:Mongo > db.test4.update({a : 1, b : 1, c : 1}, {$set : { d : 1}}, true, false) 
test:Mongo > db.test4.find() 
{ "_id" : ObjectId("51ae978960d5a3436edbaf7d"), "a" : 1, "b" : 1, "d" : 1 } 
{ "_id" : ObjectId("51ae97b960d5a3436edbaf7e"), "a" : 1, "b" : 1, "c" : 1, "d" : 1 } 
+0

這是倒退。如果所有三個字段都不存在,他希望允許重複。如果只有三個字段中的兩個出現,使用upserts將防止重複 - 此外,這會顯着複雜邏輯,因爲每個插入需要檢查要插入的文檔,以確定三個字段中的哪一個存在以進行更新。另外當你想對文檔的不同屬性做一個真正的upsert時會發生什麼? –

+0

如果所有三個鍵都存在於文檔中(插入),則可以通過執行upserts(而不是插入)來輕鬆解決此問題,我想這很容易從應用程序中檢查。休息我從來沒有談論過這個表演。但考慮到這些字段的索引不會是一個巨大的性能問題,因爲在正常的插入中也會更新索引,因此必須將其帶入內存。這個解決方案只是建議作爲解決方法。 –

+0

當你需要根據不同的值做一個upsert時會發生什麼 - 比如說基於用戶名或id或者...? –