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

MongoDB如何在$map条目添加sum字段且无需罗列所有属性

解决方案:用$mergeObjects合并原属性与新增字段

当然有更优雅的实现方式!你完全不用手动罗列所有已有属性,借助MongoDB的$mergeObjects操作符,就能在保留数组元素原有所有字段的基础上,轻松新增sum属性。

完整聚合查询代码

db.items.aggregate([
  {
    $project: {
      values: {
        $map: {
          input: "$values",
          as: "v",
          in: {
            $mergeObjects: [
              "$$v", // 直接保留原数组元素的全部属性
              { sum: { $add: ["$$v.number1", "$$v.number2"] } } // 新增sum计算字段
            ]
          }
        }
      }
    }
  }
])

代码逻辑说明

  • $mergeObjects的作用是将多个对象合并为一个,这里我们把原数组元素($$v)和包含sum的新对象合并,既保留了所有原有属性,又添加了新字段。
  • 这种方式的好处是完全不需要关心原数组元素有哪些字段,就算后续新增其他属性,这个查询也能自动适配,不用修改代码。

执行后的预期结果

运行上述查询后,会得到你想要的输出:

{
  "values": [
    {
      "number1": 5,
      "number2": 6,
      "anotherProp": "...",
      "anotherProp2": "...",
      "sum": 11
    },
    {
      "number1": 8,
      "number2": 1,
      "anotherProp": "...",
      "anotherProp2": "...",
      "sum": 9
    }
  ]
}

另外你提到尝试$addFields没得到理想结果,是因为$addFields默认是给顶级文档添加字段,而这里需要操作数组内部的每个元素,所以结合$map和$mergeObjects才是正确的处理方式哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:17:27