如何按特定条件对MongoDB分组结果进行汇总整理?
MongoDB 自定义状态分组统计实现方案
核心逻辑
先给每条数据打上对应目标类别(IN_AUCTION/PROCESSING/DELIVERING/OTHERS)的标签,再按标签分组统计数量,还可按需把结果整理成更直观的键值对格式。
完整聚合代码
假设你的状态映射规则如下(可根据实际需求修改数组内的status_id值):
- IN_AUCTION: [1, 2, 3]
- PROCESSING: [4, 5, 6]
- DELIVERING: [7, 8]
直接运行以下聚合管道:
db.yourCollection.aggregate([ // 第一步:为每条数据添加类别标签 { $addFields: { status_category: { $switch: { branches: [ { case: { $in: ["$status_id", [1, 2, 3]] }, then: "IN_AUCTION" }, { case: { $in: ["$status_id", [4, 5, 6]] }, then: "PROCESSING" }, { case: { $in: ["$status_id", [7, 8]] }, then: "DELIVERING" } ], default: "OTHERS" } } } }, // 第二步:按类别分组统计数量 { $group: { _id: "$status_category", count: { $sum: 1 } } }, // 可选:把多文档结果合并为单文档的键值对(更易读取) { $group: { _id: null, status_stats: { $mergeObjects: { $arrayToObject: [[["$_id", "$count"]]] } } } }, // 可选:只保留统计结果字段 { $project: { _id: 0, status_stats: 1 } } ])
结果说明
- 不使用最后两个可选阶段时,输出是各类别独立文档:
{ "_id" : "IN_AUCTION", "count" : 15 } { "_id" : "PROCESSING", "count" : 8 } { "_id" : "DELIVERING", "count" : 5 } { "_id" : "OTHERS", "count" : 3 } - 使用可选阶段后,输出为包含所有统计的单文档:
{ "status_stats" : { "IN_AUCTION" : 15, "PROCESSING" : 8, "DELIVERING" : 5, "OTHERS" : 3 } }
注意事项
- 替换
yourCollection为你的实际集合名称 - 若
status_id是字符串类型,把数组内的数字改成对应字符串即可 - 可根据业务需求随时调整各类别对应的
status_id集合
内容的提问来源于stack exchange,提问作者ABDULLOKH MUKHAMMADJONOV
相关产品推荐
相关产品推荐

