You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB 4.2.3如何为动态键对象的所有数组添加指定值

MongoDB 4.2.3 动态键数组批量更新方案

由于profiles内的键是动态不确定的,无法直接通过固定字段路径更新,需要借助聚合管道式更新(MongoDB 4.2+支持该特性)来实现:

核心思路

  1. 将profiles对象转换为键值对数组($objectToArray),方便遍历处理每个动态键对应的数组
  2. 遍历键值对数组,为每个数组追加值11(或插入到指定位置)
  3. 将处理后的键值对数组转回对象($arrayToObject),重新赋值给profiles

具体命令

方案1:在每个数组末尾追加11

db.yourCollection.updateMany(
  {}, // 匹配所有文档,如需指定条件可修改此处
  [
    {
      $set: {
        profiles: {
          $arrayToObject: {
            $map: {
              input: { $objectToArray: "$profiles" },
              in: {
                k: "$$this.k",
                v: { $concatArrays: ["$$this.v", [11]] }
              }
            }
          }
        }
      }
    }
  ]
)

方案2:在每个数组开头插入11

如果需要把11放在数组最前面,只需调整$concatArrays的参数顺序:

db.yourCollection.updateMany(
  {},
  [
    {
      $set: {
        profiles: {
          $arrayToObject: {
            $map: {
              input: { $objectToArray: "$profiles" },
              in: {
                k: "$$this.k",
                v: { $concatArrays: [[11], "$$this.v"] }
              }
            }
          }
        }
      }
    }
  ]
)

补充说明

  • 替换yourCollection为你的集合名称
  • 若只需更新单个文档,将updateMany改为updateOne并添加匹配条件(比如{ _id: "13hu13o13uuo1" })
  • 若需避免重复添加11,可改用$cond结合$in判断,仅当数组中不存在11时才添加:
    v: {
      $cond: {
        if: { $in: [11, "$$this.v"] },
        then: "$$this.v",
        else: { $concatArrays: ["$$this.v", [11]] }
      }
    }
    

内容的提问来源于stack exchange,提问作者Thiago Cavalcanti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:45:33