我正在使用mongodb 2.6.1。但是,我无法使用稀疏创建唯一索引。目前,我有以下索引:
> 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
}
我真的不知道如何解决它。
答案 0 :(得分:2)
您正在创建的稀疏索引将允许多个文档在没有source_url
字段的情况下存在,但仍然只允许存在字段的一个文档的值为null
。换句话说,稀疏索引不会将null
值的情况视为任何不同的情况,只会丢失缺少的字段情况。
因此,处理问题的典型方法是更新您的集合,以便在创建索引之前从现有文档中删除source_url
字段,其值为null
:
db.products.update({source_url: null}, {$unset: {source_url: true}}, {multi: true})
然后在程序逻辑中使用缺少字段作为null
指示符。