基于MongoDB的数据分组:保留Top2分组并将其余归为Useless
MongoDB聚合实现分组统计并合并剩余分组为Useless
这是个挺常见的聚合统计场景,咱们可以用MongoDB的聚合框架来完美实现。下面直接上完整的聚合命令,再一步步拆解每个阶段的作用:
db.yourCollectionName.aggregate([ // 第一步:按setting分组,计算每个分组的counting总和 { $group: { _id: "$setting", total_count: { $sum: "$counting" } } }, // 第二步:按总和降序排序,这样前两个就是数值最高的分组 { $sort: { total_count: -1 } }, // 第三步:用facet把数据分成两组:前2个顶级分组,和剩下的所有分组 { $facet: { top_two: [{ $limit: 2 }], rest: [{ $skip: 2 }] } }, // 第四步:处理剩余分组,计算它们的总和,然后和top_two合并成一个数组 { $project: { combined: { $concatArrays: [ "$top_two", [{ setting: "Useless", counting: { $sum: "$rest.total_count" } }] ] } } }, // 第五步:把合并后的数组展开成单个文档 { $unwind: "$combined" }, // 第六步:将每个文档的内容替换为根文档,调整成需要的格式 { $replaceRoot: { newRoot: { $mergeObjects: [ "$combined", { setting: "$combined._id", counting: "$combined.total_count" } ] } } }, // 最后一步:移除不需要的_id和total_count字段 { $project: { _id: 0, total_count: 0 } } ])
各阶段详细说明:
- $group:按
setting字段分组,用$sum计算每个分组下counting的总和,存到total_count字段里。这一步先把原始数据的重复分组合并成统计后的结果。 - $sort:对统计后的结果按
total_count降序排列,确保数值最高的分组排在最前面。 - $facet:这个阶段很关键,它能把数据流分成多个分支处理。这里我们分成
top_two(取前2个分组)和rest(跳过前2个,取剩下的所有分组)。 - $project:把
top_two数组和一个新的Useless文档合并成combined数组。新文档的counting值是rest数组里所有total_count的总和,用$sum计算。 - $unwind:把
combined数组拆分成一个个独立的文档,这样我们就能得到单个的分组文档。 - $replaceRoot:调整文档结构,把
_id(原setting值)赋值给setting字段,total_count赋值给counting字段,让输出格式符合需求。 - $project:移除不需要的
_id和total_count字段,得到最终的干净结果。
执行这个聚合命令后,就能得到你期望的输出:
[ { "setting": "Contrast", "counting": 2 }, { "setting": "Sharpness", "counting": 2 }, { "setting": "Useless", "counting": 3 } ]
内容的提问来源于stack exchange,提问作者Ashish Choudhary
相关产品推荐
相关产品推荐

