Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB无法创建唯一的稀疏索引(重复键)_Mongodb - Fatal编程技术网

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

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

我想在两列上创建一个唯一的索引,其中索引应该允许索引的第二部分使用多个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.6.5

复合索引应被视为一个整体,因此唯一要求(userId,name)对在集合中必须是唯一的,稀疏意味着如果文档中同时缺少userIdname,则允许。错误消息显示至少有两个文档的(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。事实上,稀疏仅适用于不存在的字段。空字段计为现有字段。这很愚蠢,但我不得不接受它。似乎我必须重构我的数据模型:-(