无法使用稀疏mongodb创建唯一索引

时间:2014-12-24 16:15:07

标签: mongodb

我正在使用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
}

我真的不知道如何解决它。

1 个答案:

答案 0 :(得分:2)

您正在创建的稀疏索引将允许多个文档在没有source_url字段的情况下存在,但仍然只允许存在字段的一个文档的值为null。换句话说,稀疏索引不会将null值的情况视为任何不同的情况,只会丢失缺少的字段情况。

因此,处理问题的典型方法是更新您的集合,以便在创建索引之前从现有文档中删除source_url字段,其值为null

db.products.update({source_url: null}, {$unset: {source_url: true}}, {multi: true})

然后在程序逻辑中使用缺少字段作为null指示符。