如何在MongoDB中更新文档最内层嵌套的键名
MongoDB修改数组内错误键名方案
你可以根据你的MongoDB版本选择对应实现方案:
方案1:MongoDB 4.2及以上版本(推荐,原子操作)
直接使用带聚合管道的updateMany方法,只会匹配存在错误键名的文档,不会修改已经正确的文档2:
db.your_collection_name.updateMany( // 查询条件:仅匹配存在错误键名的文档 { "ARCM Sum.Activity Checks.Activity Description contains > 20 word": { $exists: true } }, // 聚合管道更新逻辑 [ { $set: { "ARCM Sum.Activity Checks": { $map: { input: "$ARCM Sum.Activity Checks", as: "checkItem", in: { $mergeObjects: [ "$$checkItem", // 新增正确键,值为原错误键的值 { "Activity Description contains > 20 words": "$$checkItem.Activity Description contains > 20 word" } ] } } } } }, { // 删除数组元素中的错误键 $unset: "ARCM Sum.Activity Checks.Activity Description contains > 20 word" } ] )
注意将代码中的
your_collection_name替换为你实际使用的集合名
方案2:MongoDB 4.2以下版本
通过遍历查询游标逐个更新文档:
// 找到所有包含错误键名的文档 db.your_collection_name.find( { "ARCM Sum.Activity Checks.Activity Description contains > 20 word": { $exists: true } } ).forEach(function(doc) { // 遍历Activity Checks数组的每个元素 doc["ARCM Sum"]["Activity Checks"].forEach(function(checkItem) { // 存在错误键时执行替换 if (checkItem.hasOwnProperty("Activity Description contains > 20 word")) { checkItem["Activity Description contains > 20 words"] = checkItem["Activity Description contains > 20 word"]; delete checkItem["Activity Description contains > 20 word"]; } }); // 保存修改后的文档 db.your_collection_name.save(doc); })
操作前注意
- 执行更新前请先执行查询语句确认匹配的文档符合预期,避免误操作:
db.your_collection_name.find({"ARCM Sum.Activity Checks.Activity Description contains > 20 word": {$exists: true}}) - 生产环境操作前请提前备份相关数据。
内容的提问来源于stack exchange,提问作者user15780176
相关产品推荐
相关产品推荐

