以下是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"
}
]
答案 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 })