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

如何通过单查询用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:05:23