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
相关产品推荐
相关产品推荐

