MongoDB无法创建唯一的稀疏索引(重复键)
我想在两列上创建一个唯一的索引,其中索引应该允许索引的第二部分使用多个null值。但是:MongoDB无法创建唯一的稀疏索引(重复键),mongodb,Mongodb,我想在两列上创建一个唯一的索引,其中索引应该允许索引的第二部分使用多个null值。但是: db.model.ensureIndex({userId : 1, name : 1},{unique : true, sparse : true}); 引发重复密钥异常:E11000重复密钥错误索引:devmongo.model.$userId\u 1\u name\u 1重复密钥:{:“-1”,:null}。我认为,由于稀疏=真选项,索引应该允许这个星座?我怎样才能做到这一点?我使用MongoDB 2
db.model.ensureIndex({userId : 1, name : 1},{unique : true, sparse : true});
引发重复密钥异常:E11000重复密钥错误索引:devmongo.model.$userId\u 1\u name\u 1重复密钥:{:“-1”,:null}。我认为,由于稀疏=真选项,索引应该允许这个星座?我怎样才能做到这一点?我使用MongoDB 2.6.5复合索引应被视为一个整体,因此唯一要求(userId,name)对在集合中必须是唯一的,稀疏意味着如果文档中同时缺少userId和name,则允许。错误消息显示至少有两个文档的(userId、name)对是等效的(如果缺少字段,则可以将该值视为null) 如果存在任何字段,稀疏复合索引将为文档创建索引项,并将索引中文档中不存在的任何字段的值设置为
null
。换句话说:如果文档中缺少所有的索引字段,稀疏复合索引只会跳过文档
从v3.2开始,可以用来完成您想要做的事情。您可以使用:
db.model.ensureIndex({userId : 1, name : 1}, { partialFilterExpression: { name: { $exists: true }, unique: true });
它将仅为具有名称
字段的文档编制索引
NB:mongo无法使用此索引处理用户ID的查询,因为它不会包含集合中的所有文档。此外,文档中的
null
被视为一个值,并且存在一个具有null
值的字段。在我的例子中,字段名是区分大小写的
因此,在
{field1:1,field2:1}
上创建一个复合索引与{field1:1,field2:1}是不同的,所以我将所有userId:“-1”更新为null,但仍然无法创建索引:E11000重复键错误索引:devmongo.model.$userId_1_name_1 dup key:{:null,:null}@KIC,如果可以将该值更新为null,则表示可以删除该字段,对吗?只删除这两个字段(userId和name),然后稀疏工作,这将告诉unique文档应该不受unique的约束。因此,如果您使用will-1删除所有userId字段,请确保名称字段不重复,因为如果一个字段存在,则另一个丢失的字段将被视为null。事实上,稀疏仅适用于不存在的字段。空字段计为现有字段。这很愚蠢,但我不得不接受它。似乎我必须重构我的数据模型:-(