MongoDB新手求助:按指定ID去重统计数据问题
修正MongoDB聚合管道实现去重统计
嘿,我来帮你搞定这个去重统计的问题~ 先看看你现有管道的问题:
- 硬编码了
client_id: "1",只能统计单个客户,没法处理所有数据 - 分组只按
invoice_month,没结合client_id,会把不同客户的同一月份合并 - 没有做去重处理,所以会把重复文档都算进去
下面是修正后的聚合管道,完全符合你的预期结果:
[ // 过滤出账户状态为Active的所有文档(不要硬编码client_id哦) { "$match": { "invoice.account_status": "Active" } }, // 展开invoice数组,方便后续访问里面的字段 { "$unwind": "$invoice" }, // 按「client_id + invoice_month」组合分组,自动去重重复的组合 { "$group": { "_id": { "client_id": "$client_id", "invoice_month": "$invoice.invoice_month" } } }, // 转换成你需要的输出格式,设置count为1 { "$project": { "_id": 0, "client_id": "$_id.client_id", "invoice_month": "$_id.invoice_month", "count": 1 } } ]
步骤解释:
- $match阶段:去掉了固定的client_id筛选,保留所有账户状态为Active的文档,这样能处理所有客户的数据
- $unwind阶段:把每个文档里的invoice数组展开(虽然你的数据里每个invoice只有一个元素,但必须展开才能直接访问invoice_month)
- $group阶段:用
client_id和invoice_month的组合作为分组依据,这样所有重复的客户+月份组合会被合并成一条记录,自动完成去重 - $project阶段:把分组后的_id拆分成你需要的字段,设置count为1,同时去掉默认的_id字段,得到和预期完全一致的输出
内容的提问来源于stack exchange,提问作者arun kumar
相关产品推荐
相关产品推荐

