如何通过单查询用$inc递增age与cat.age且不新增cat字段?
解决方案
要实现给所有文档的age字段递增1,同时仅给存在cat字段的文档的cat.age递增1,且不为无cat字段的文档新增该字段,可以使用MongoDB 4.2及以上版本支持的聚合管道式更新,通过条件判断避免创建不存在的字段路径:
db.people.updateMany( {}, [ // 给所有文档的age字段加1 { $set: { age: { $add: ["$age", 1] } } }, // 仅当cat字段存在时,给cat.age加1;否则不修改该路径 { $set: { "cat.age": { $cond: { if: { $exists: ["$cat", true] }, then: { $add: ["$cat.age", 1] }, else: "$$REMOVE" } } } } ] )
代码说明
- 第一个
$set阶段:对所有文档,将age字段的值通过$add实现自增1。 - 第二个
$set阶段:通过$cond条件判断cat字段是否存在:- 若
cat字段存在,就将cat.age的值自增1; - 若
cat字段不存在,使用$$REMOVE关键字跳过该字段路径的修改,不会为文档新增cat对象。
- 若
这种方式既满足单条查询的要求,又能精准控制字段更新逻辑,避免不必要的字段创建。
内容的提问来源于stack exchange,提问作者codinmach
相关产品推荐
相关产品推荐

