MongoDB如何一次性完成多条件下的聚合计数统计
MongoDB 多条件聚合计数实现方案
MongoDB 原生支持单次查询完成不同分组维度的计数统计,不需要拆分多次查询,针对你提出的按val字段值分类统计记录数的需求,使用聚合管道的$group阶段即可实现。
测试数据说明
你提供的测试集合结构如下:
| _id | no | val |
|---|---|---|
| 1 | 1 | a |
| 2 | 2 | a |
| 3 | 3 | b |
| 4 | 4 | c |
预期统计目标:val=a共2条、val=b共1条、val=c共1条。
基础实现语句
假设你的集合名为your_collection,执行以下聚合语句即可得到目标结果:
db.your_collection.aggregate([ { // 按val字段的值分组 $group: { _id: "$val", // 每组逐条累加1,得到对应分组的记录总数 record_count: { $sum: 1 } } } ])
返回结果
语句执行后的返回内容如下,和你的预期完全匹配:
[ { "_id": "a", "record_count": 2 }, { "_id": "b", "record_count": 1 }, { "_id": "c", "record_count": 1 } ]
扩展:输出键值对格式结果
如果你需要更直观的、以val值为键的统计结果,可以在聚合管道中追加阶段调整输出结构:
db.your_collection.aggregate([ { $group: { _id: "$val", count: { $sum: 1 } } }, { $replaceRoot: { newRoot: { $arrayToObject: [[{ k: "$_id", v: "$count" }]] } } } ])
该语句返回格式为:
{ "a": 2, "b": 1, "c": 1 }
如果后续需要实现更复杂的跨条件统计(比如同时统计val为a的数量、no大于2的数量、val为c的数量这类不同规则的并行计数),可以使用$facet阶段在单次查询中完成多维度统计,避免多次和数据库交互产生额外开销。
内容的提问来源于stack exchange,提问作者Julia5049
相关产品推荐
相关产品推荐

