我使用的是mongodb 2.6.1。但是,我无法使用sparse创建唯一索引。目前,我有以下索引:
> db.products.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "snapyshop_production.products"
},
{
"v" : 1,
"key" : {
"pickup_location" : "2dsphere"
},
"name" : "pickup_location_2dsphere",
"background" : true,
"ns" : "snapyshop_production.products",
"2dsphereIndexVersion" : 2
},
{
"v" : 1,
"key" : {
"category_id" : 1
},
"name" : "category_id_1",
"background" : true,
"ns" : "snapyshop_production.products"
},
{
"v" : 1,
"key" : {
"_keywords" : 1
},
"name" : "_keywords_1",
"background" : true,
"ns" : "snapyshop_production.products"
}
]
但是当我运行这个命令时,它会打印出错误:
> db.products.ensureIndex( { source_url: 1 }, { background: true, sparse: true, unique: true } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 4,
"ok" : 0,
"errmsg" : "E11000 duplicate key error index: snapyshop_production.products.$source_url_1 dup key: { : null }",
"code" : 11000
}
我真的不知道该怎么修。
2条答案
按热度按时间fd3cxomn1#
您正在创建的稀疏索引将允许多个文档在没有
source_url
字段的情况下存在,但仍然只允许一个文档的字段值为null
。换句话说,稀疏索引不会处理null
值的情况,只有缺少字段的情况。因此,处理问题的典型方法是在创建索引之前更新集合,从现有文档中删除值为
null
的source_url
字段:然后在程序逻辑中使用该字段的缺失作为
null
指示符。rdlzhqv92#
我发现,仅仅搜索具有空值的文档返回的文档要比搜索字段存在且字段为空的文档返回的结果集小得多。仅仅搜索空值包括空值和未设置的值。我认为我可以通过以下方式稍微改进公认的答案: