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

MongoDB同一查询多聚合分组问题:二次$sum返回0

解决MongoDB连续$group阶段返回0的问题

嘿,我来帮你捋清楚这个问题——你第二个$group阶段返回0的核心原因很明确:第一个$group执行后,输出的文档里已经没有deviceid和total这两个字段了,MongoDB对不存在的字段执行$sum操作时,默认会返回0。

让我给你拆解一下:
当你执行第一个$group:

{$group: {_id: '$cashier', cost: {$sum: "$total"}}}

它输出的文档结构是这样的:

{ "_id": "收银员A", "cost": 1000 }

这里只有_id(对应原文档的cashier)和cost(求和后的总金额),完全没有deviceid和total字段。所以第二个$group里的$deviceid和$total都是无效引用,自然求和结果为0。

接下来根据你的实际需求,给你两种可行的解决方案:


方案1:同时按两个维度分组(收银员+设备)

如果你想统计每个收银员在每台设备上的总交易金额,只需要把两个分组字段放到同一个$group的_id里即可:

db.transactions.aggregate([
  {
    $group: {
      _id: {
        cashier: "$cashier",
        deviceid: "$deviceid"
      },
      totalCost: { $sum: "$total" }
    }
  }
])

这个查询会返回类似这样的结果:

{ "_id": { "cashier": "收银员A", "deviceid": "设备X" }, "totalCost": 500 }
{ "_id": { "cashier": "收银员A", "deviceid": "设备Y" }, "totalCost": 300 }

方案2:并行统计两种维度的总和

如果你想分别统计按收银员分组的总金额,以及按设备分组的总金额,推荐使用$facet阶段来并行执行两个独立的聚合管道,互不干扰:

db.transactions.aggregate([
  {
    $facet: {
      byCashier: [
        { $group: { _id: "$cashier", cost: { $sum: "$total" } } }
      ],
      byDevice: [
        { $group: { _id: "$deviceid", cost: { $sum: "$total" } } }
      ]
    }
  }
])

这个查询会返回一个包含两个数组的结果:

{
  "byCashier": [
    { "_id": "收银员A", "cost": 800 },
    { "_id": "收银员B", "cost": 1200 }
  ],
  "byDevice": [
    { "_id": "设备X", "cost": 700 },
    { "_id": "设备Y", "cost": 1300 }
  ]
}

总之,你之前的问题本质是聚合阶段的字段传递错误——第一个$group已经丢弃了后续需要的字段,导致第二个阶段无法正确引用。根据你的实际业务需求选择上面的方案就能解决啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:55:52