MongoDB:如何重命名多层嵌套(对象→数组→对象)中的字段?
解决MongoDB数组嵌套字段重命名问题
问题背景
需要将文档中basicData.devices.relatedJson.equipmentID(大写D)重命名为equipmentId(小写d),同时保持文档其他所有结构和字段不变。原文档结构如下:
{ "_id":12345, "name":"harold", "basicData":{ "devices":[ { "id":7654, "relatedJson":{ "make":"sony", "equipmentID":"asdf" } }, { "id":9493 } ], "car":"toyota" } }
原代码的问题在于直接用$$this.relatedJson合并新对象,导致整个device元素被替换成relatedJson的内容,丢失了id等其他字段,逻辑不符合需求。
正确的更新脚本
db.serviceAgreement.updateMany( // 匹配条件:仅处理包含目标字段的文档 {"basicData.devices.relatedJson.equipmentID": {$exists: true}}, [ { $set: { "basicData.devices": { $map: { input: "$basicData.devices", in: { $cond: { // 判断当前device是否存在relatedJson.equipmentID if: {$and: [ {$ne: ["$$this.relatedJson", undefined]}, {$exists: ["$$this.relatedJson.equipmentID"]} ]}, then: { // 保留原device的所有字段,仅修改relatedJson部分 $mergeObjects: [ "$$this", { relatedJson: { $mergeObjects: [ "$$this.relatedJson", {equipmentId: "$$this.relatedJson.equipmentID"} ], // 删除原equipmentID字段 $unset: ["equipmentID"] } } ] }, // 不满足条件的device直接返回原内容 else: "$$this" } } } } } } ] )
代码解释
- 匹配条件:精准定位包含
relatedJson.equipmentID的文档,避免无意义的遍历。 - $map遍历数组:逐个处理
devices中的每个元素:- 条件判断:先检查当前device是否存在
relatedJson及equipmentID字段,避免处理无相关数据的元素。 - $mergeObjects层级合并:
- 第一层合并保留原device的所有字段(如
id)。 - 第二层合并修改
relatedJson:保留原relatedJson的其他字段(如make),添加新的equipmentId字段。 - 用
$unset在relatedJson内部删除旧的equipmentID字段。
- 第一层合并保留原device的所有字段(如
- 默认返回原元素:不满足条件的device直接保持原样,不做任何修改。
- 条件判断:先检查当前device是否存在
内容的提问来源于stack exchange,提问作者mal
相关产品推荐
相关产品推荐

