pymongo重命名索引键会引发重复键错误

时间:2019-07-09 13:22:07

标签: mongodb

以下是mongodb中的文档。尝试重命名索引键时,它将引发重复键错误。我想重命名索引键而没有任何错误。请帮助我实现这一目标

以下是“ ne-mgmt”数据库和“ NEs”集合中的文档。

Mongo文档:

{
        "_id" : ObjectId("5d15c50dbea32e000199569b"),
        "created_ts" : NumberLong("1561707789892"),
        "is_error" : "NO",
        "user_id" : "",
        "gne_port" : "34149",
        "passwd" : "",
        "target_id" : "cmbrmawa-0111105b",
        "region" : "Massachusetts",
        "ne_status" : "ASSIGNED",
}

以下是重命名索引键时遇到的错误 错误:

rs0:PRIMARY> db.NEs.update({}, {$rename:{"target_id":"TARGET_ID"}}, false, true);
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: ne-mgmt-db.NEs index: target_id dup key: { : null }"
        }
})

使用getIndexes()方法检查索引。当我尝试删除索引并尝试重命名时,它工作正常。但我希望它不会删除索引。

索引:

rs0:PRIMARY> db.NEs.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "ne-mgmt-db.NEs"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "target_id" : 1
                },
                "name" : "target_id",
                "ns" : "ne-mgmt-db.NEs"
        }
]

1 个答案:

答案 0 :(得分:1)

您可能仅在unique字段上创建target_id索引。

db.getCollection('localdatabases').createIndex({ target_id: 1 }, { unique: true })

现在,当使用$rename运算符运行更新命令时,同一字段的其他字段(即新的TARGET_ID的字段被设置为null,因此对于具有相同值的多个字段会引发错误为null

因此,为避免出现at情况,您还需要设置sparse索引。

db.getCollection('localdatabases').createIndex({ target_id: 1 }, { unique: true, sparse: true })