2

我有一个集合:“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'};
4

1 回答 1

1

如果您真的非常绝望,请将您的价值作为关键:

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

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

而不是null,您可以使用1or"bogus"或其他。只要确保它总是一样的,最好是小。

请注意,键必须是唯一稀疏的,否则缺少的steve字段将被解释为"steve" : null. 因为稀疏键实际上只在单个文档上,所以我猜这个解决方案甚至不是特别昂贵。

于 2013-10-17T21:33:44.537 回答