You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:13