MongoDB 5.0.6技术问询:如何重命名嵌套数组中的字段名?
解决MongoDB多层嵌套数组字段重命名的报错问题
你尝试用updateMany加$rename重命名嵌套数组里的字段,执行语句:
db.Objective.updateMany({}, {$rename: {'KeyResults.KeyResultWatchers.DisplayName':'KeyResults.KeyResultWatcher.FullName'}})
结果报了错:cannot use the part (KeyResults of KeyResults.KeyResultWatchers.DisplayName) to traverse the element
为啥报错?
$rename搞不定多层嵌套数组的字段改名。你这里KeyResults是个数组,里面每个元素的KeyResultWatchers又是数组,直接用点路径定位,MongoDB没法正确遍历这两层数组,所以就报错了。
解决办法:用更新管道(MongoDB 4.2及以上版本支持)
用聚合管道的方式来做更新,通过$map遍历两层数组,还能处理KeyResultWatchers是null、空数组或者部分元素没DisplayName的情况,代码如下:
db.Objective.updateMany( {}, [ { $set: { KeyResults: { $map: { input: "$KeyResults", as: "kr", in: { // 保留KeyResults里每个元素的原有字段(比如Title) ..."$$kr", KeyResultWatchers: { $cond: { if: { $ne: ["$$kr.KeyResultWatchers", null] }, then: { $map: { input: "$$kr.KeyResultWatchers", as: "watcher", in: { // 保留观察者对象的其他字段,把DisplayName改名为FullName ..."$$watcher", FullName: "$$watcher.DisplayName", $unset: ["DisplayName"] } } }, // 如果KeyResultWatchers是null,就保持原样 else: "$$kr.KeyResultWatchers" } } } } } } } ] )
代码解释
- 外层
$map遍历顶层的KeyResults数组,逐个处理每个关键结果元素 ...$$kr是把当前元素的所有原有字段(比如Title)都保留下来,不会丢数据- 先判断
KeyResultWatchers是不是null,不是的话就用内层$map遍历每个观察者对象 - 内层
$map里,同样保留观察者的其他字段,新增FullName字段并赋值原DisplayName的值,再删掉原来的DisplayName - 如果
KeyResultWatchers是null或者空数组,直接保持原来的状态不变
验证效果
跑这个代码之后:
_id:0的文档里,KeyResultWatchers里的DisplayName都会变成FullName_id:1的KeyResultWatchers:null完全不受影响_id:3里那个没有DisplayName的观察者对象,啥变化都没有_id:4里多个KeyResults元素,每个里面的观察者字段都会被正确改名
内容的提问来源于stack exchange,提问作者zeylmz
相关产品推荐
相关产品推荐

