我有一个集合:“foo”
foo: {name: 'steve'}
因此,要使名称成为您将运行的唯一索引:
db.foo.ensureIndex( {{name: 1}}, { unique: true } )
但是,我想要做的是确保只允许一个值为'steve'的名称。有没有办法让字段成为唯一索引,但是指定只有在该属性的值具有特定值时才强制执行?
伪查询..... 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'};
答案 0 :(得分: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
字段将被解释为"steve" : null
。因为稀疏密钥实际上只在一个文档上,所以我认为这个解决方案甚至不是特别昂贵。