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
相关产品推荐
相关产品推荐

