2013-10-17 84 views
2

我有一個集合:「富」蒙戈,集合在執行某一特定領域具有獨特的價值

foo: {name: 'steve'} 

因此,爲了使名稱唯一索引,你可以運行:

db.foo.ensureIndex({{name: 1}}, { unique: true }) 

然而我想要做的是確保只有一個名字的值爲'史蒂夫'是允許的。有沒有辦法讓一個字段成爲一個唯一的索引,但是指定只有當該屬性的值具有特定值時才應該執行該索引。

僞查詢..... db.foo.ensureIndex({{name: 'steve'}}, { unique: true })

foo: {name: 'steve'); 
foo: {name: 'chris'}; 
foo: {name: 'chris'}; 
foo: {name: 'mike'}; 
foo: {name: 'mike'}; 

foo: {name: 'steve'); 
foo: {name: 'steve'}; 
foo: {name: 'chris'}; 
foo: {name: 'chris'}; 
foo: {name: 'mike'}; 
foo: {name: 'mike'}; 
+2

我不確定通過索引來做到這一點,但會好奇地看着這個問題。可能需要通過代碼來處理。 –

回答

1

如果你真的,真的絕望,讓你的價值的關鍵:

db.uniq.insert({ "name" : {"steve" : null } }); 
db.uniq.insert({ "name" : {"john" : null } }); 

db.uniq.ensureIndex({"name.steve" : 1}, {unique : true, sparse: true}); 

而不是null,你可以使用1"bogus"或其他。只要確保它總是一樣的,最好是小的。

注意,關鍵必須是唯一稀疏,否則丟失steve字段將intepreted像"steve" : null。因爲稀疏密鑰實際上只在單個文檔上,所以我猜這個解決方案並不是特別昂貴。

+0

感謝您的答覆,不幸的是,我無法真正改變代碼/值,或者我需要經歷一堆繁文red節。希望有一些使用ensureIndex我不知道是一個簡單的修復。 – nwkeeley