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

MongoDB:对嵌套数组中非空quantity字段批量加1

解决方案:批量更新嵌套数组中所有非null的quantity字段

要解决这个问题,你需要使用MongoDB 4.2及以上版本支持的聚合管道式更新——传统的$占位符只能匹配数组中第一个符合条件的元素,而聚合管道可以遍历数组并处理每一个元素,刚好满足你的需求。

下面是针对你目标文档的完整更新命令:

db.collection.updateOne(
  { "_id": 1 }, // 匹配目标文档的查询条件
  [
    {
      $set: {
        // 处理systems数组
        "systems": {
          $map: {
            input: "$systems",
            as: "item",
            in: {
              $mergeObjects: [
                "$$item",
                {
                  quantity: {
                    $cond: {
                      if: { $ne: ["$$item.quantity", null] },
                      then: { $add: ["$$item.quantity", 1] },
                      else: "$$item.quantity"
                    }
                  }
                }
              ]
            }
          }
        },
        // 处理games数组
        "games": {
          $map: {
            input: "$games",
            as: "item",
            in: {
              $mergeObjects: [
                "$$item",
                {
                  quantity: {
                    $cond: {
                      if: { $ne: ["$$item.quantity", null] },
                      then: { $add: ["$$item.quantity", 1] },
                      else: "$$item.quantity"
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  ]
)

关键逻辑解释:

  • $map:遍历目标数组的每一个元素,对每个元素应用自定义转换规则。
  • $mergeObjects:将原数组元素的所有字段(比如name)和我们修改后的quantity字段合并,确保其他字段不受影响。
  • $cond:条件判断核心——检查当前元素的quantity是否不为null,若是则执行$add递增1,否则保留原null值。
  • 聚合管道作为更新参数:这种方式允许在更新操作中使用聚合表达式,实现普通更新语法无法完成的复杂数组批量修改。

执行该命令后,你的文档中systems和games数组里所有非null的quantity都会被正确递增1,完全符合你期望的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:01