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

MongoDB聚合查询中嵌套对象的投影与分组求和问题

MongoDB聚合查询报错排查与修正方案

现有文档数据

[
  {
      city: "Mumbai",
      meta: {
        luggage: 2,
        scanLuggage: 1,
        upiLuggage: 1
      },
      cash: 10
  },
  {
    city: "Mumbai",
    meta: {
      luggage: 4,
      scanLuggage: 3,
      upiLuggage: 1
    },
    cash: 24
  }
]

需求说明

匹配city为Mumbai的文档,对meta下的luggage、scanLuggage、upiLuggage三个字段分别求和。


报错原因

原聚合查询的问题集中在这几点:

  1. $project阶段拼写错误:把meta.luggage写成了mata.luggage,字段名拼写错误直接导致投影失败
  2. $project嵌套字段写法错误:不能直接用meta.scanLuggage: 1这种格式声明嵌套字段,需要用引号包裹键名或者对象嵌套形式
  3. $group阶段语法错误:分组的_id字段写错了,正确格式是_id: "$city"(缺少下划线和字段引用的$符号)
  4. 冗余的$project阶段:$match之后可以直接执行$group,完全不需要额外投影,多此一举反而容易出错

正确聚合查询写法

简洁版(最优写法,去掉冗余$project)

直接在$match后执行分组求和,最后可选重命名字段以匹配期望输出:

City.aggregate([
  {
    $match: { city: 'Mumbai' }
  },
  {
    $group: {
      _id: "$city",
      luggage: { $sum: "$meta.luggage" },
      scanLuggage: { $sum: "$meta.scanLuggage" },
      upiLuggage: { $sum: "$meta.upiLuggage" }
    }
  },
  // 重命名_id为city,移除默认的_id字段
  {
    $project: {
      _id: 0,
      city: "$_id",
      luggage: 1,
      scanLuggage: 1,
      upiLuggage: 1
    }
  }
])

保留$project的修正版(仅作演示)

如果一定要保留投影阶段,需要修正字段写法:

City.aggregate([
  {
    $match: { city: 'Mumbai' }
  },
  {
    $project: {
      city: 1,
      "meta.luggage": 1,
      "meta.scanLuggage": 1,
      "meta.upiLuggage": 1
    }
  },
  {
    $group: {
      _id: "$city",
      luggage: { $sum: "$meta.luggage" },
      scanLuggage: { $sum: "$meta.scanLuggage" },
      upiLuggage: { $sum: "$meta.upiLuggage" }
    }
  },
  {
    $project: {
      _id: 0,
      city: "$_id",
      luggage: 1,
      scanLuggage: 1,
      upiLuggage: 1
    }
  }
])

最终输出结果

{
  city: 'Mumbai',
  luggage: 6,
  scanLuggage: 4,
  upiLuggage: 2
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:10:32