2013-10-17 54 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