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

MongoDB如何按_id批量更新嵌套子列表中不同元素的字段值

场景1:内存中操作JS/TS数组

适合数据已经加载到程序内存中的场景,通过多层遍历匹配_id完成更新:

// 原始数据
const originalData = [
  {
    "user_id": "121212121",
    "list": [
      {
        "employee_code": 8131,
        "list": [
          { "_id": "1", "time": "5:20" },
          { "_id": "2", "time": "8:20" }
        ]
      }
    ]
  }
]

// 预设更新规则,后续新增更新项只需要改这个对象即可
const updateRules = {
  "1": "5:50",
  "2": "8:40"
}

// 执行更新
originalData.forEach(userItem => {
  userItem.list.forEach(employeeItem => {
    employeeItem.list.forEach(timeItem => {
      if (updateRules[timeItem._id]) {
        timeItem.time = updateRules[timeItem._id]
      }
    })
  })
})

场景2:MongoDB数据库直接更新(v4.2及以上版本支持聚合管道更新)

如果数据存储在MongoDB中,可直接用原子更新语句操作,不需要先查再改:

db.collection.updateMany(
  // 匹配条件,可按需添加过滤规则缩小操作范围
  {},
  [
    {
      $set: {
        "list": {
          $map: {
            input: "$list",
            as: "employee",
            in: {
              $mergeObjects: [
                "$$employee",
                {
                  "list": {
                    $map: {
                      input: "$$employee.list",
                      as: "timeItem",
                      in: {
                        $mergeObjects: [
                          "$$timeItem",
                          {
                            time: {
                              $switch: {
                                branches: [
                                  { case: { $eq: ["$$timeItem._id", "1"] }, then: "5:50" },
                                  { case: { $eq: ["$$timeItem._id", "2"] }, then: "8:40" }
                                ],
                                default: "$$timeItem.time"
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  ]
)

通过$map遍历两层嵌套数组,配合$switch匹配不同_id对应的更新值,不会修改未匹配到的条目内容。

内容的提问来源于stack exchange,提问作者elad BA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:51:04