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

niknxzdl  于 2023-04-11  发布在  Go
关注(0)|答案(2)|浏览(162)

我使用的是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
}

我真的不知道该怎么修。

fd3cxomn

fd3cxomn1#

您正在创建的稀疏索引将允许多个文档在没有source_url字段的情况下存在,但仍然只允许一个文档的字段值为null。换句话说,稀疏索引不会处理null值的情况,只有缺少字段的情况。
因此,处理问题的典型方法是在创建索引之前更新集合,从现有文档中删除值为nullsource_url字段:

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

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

rdlzhqv9

rdlzhqv92#

我发现,仅仅搜索具有空值的文档返回的文档要比搜索字段存在且字段为空的文档返回的结果集小得多。仅仅搜索空值包括空值和未设置的值。我认为我可以通过以下方式稍微改进公认的答案:

db.products.updateMany({$and:[{source_url: null}, {source_url: {$exists: true}}]}, {$unset: {source_url: true}})

相关问题