MongoDB无法创建唯一的稀疏索引(重复键)

时间:2014-11-03 09:26:59

标签: mongodb

我想在两列上创建唯一索引,其中索引应该允许索引的第二部分有多个空值。但是:

db.model.ensureIndex({userId : 1, name : 1},{unique : true, sparse : true});

引发重复键异常:E11000重复键错误索引:devmongo.model。$ userId_1_name_1 dup key:{:" -1",:null}。我想因为sparse = true选项,索引应该允许这个星座?我怎样才能做到这一点?我使用MongoDB 2.6.5

3 个答案:

答案 0 :(得分:3)

如果 任何 字段存在,稀疏复合索引将为文档创建索引条目,在任何字段的索引中将值设置为null文档中不存在的。换句话说:如果文档中缺少所有索引字段,稀疏复合索引将仅跳过文档。

从v3.2起,partial indexes可用于完成您尝试做的事情。你可以使用:

db.model.ensureIndex({userId : 1, name : 1}, { partialFilterExpression: { name: { $exists: true },  unique: true });

,它只会索引具有name字段的文档。

NB: mongo不能使用此索引来处理userId的查询,因为它不包含集合中的所有文档。此外,文档中的null 被视为值,且{em>存在 的字段

答案 1 :(得分:2)

复合索引应该被视为一个整体,因此唯一要求(userId,name)对在集合中必须是唯一的,稀疏表示两者都是<在文档中遗漏了strong> userId 和名称,这是允许的。错误消息显示至少有两个文档的(userId,name)对是等效的(如果缺少一个字段,则该值可以视为null)。

答案 2 :(得分:0)

就我而言,事实证明字段名称区分大小写。

因此,在{field1 : 1, field2 : 1}上创建复合索引与{Field1 : 1, Field2 : 1}

不同