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

MongoDB按streamer_id分组聚合求和viewers的最优方法

MongoDB按streamer_id分组求和观众数的最优聚合方案

要实现按streamer_id分组并对viewers求和的需求,最直接高效的方式是使用MongoDB的聚合管道,核心依赖$group阶段完成分组与聚合计算:

聚合命令示例

db.events.aggregate([
  {
    $group: {
      _id: "$streamer_id", // 按streamer_id作为分组依据
      streamer_id: { $first: "$streamer_id" }, // 保留streamer_id字段
      total_viewers: { $sum: "$viewers" } // 对viewers字段求和
    }
  },
  // 可选:如果需要自定义_id而非使用streamer_id,可添加此阶段
  {
    $project: {
      _id: { $toString: { $objectId: "" } }, // 生成随机字符串格式的唯一ID
      streamer_id: 1,
      total_viewers: 1
    }
  }
])

代码解释

  1. $group阶段:

    • _id: "$streamer_id":指定以streamer_id作为分组键,确保同个主播的所有文档被归为一组
    • streamer_id: { $first: "$streamer_id" }:从每组中取出第一个streamer_id值,保证输出结果中包含该字段
    • total_viewers: { $sum: "$viewers" }:使用$sum累加每组内所有文档的viewers值,得到该主播的总观众数
  2. 可选$project阶段:
    如果不需要将streamer_id作为结果的_id,可以通过这个阶段生成自定义的唯一ID,同时保留需要的字段。

输出结果

执行上述命令后,会得到符合预期的结果:

[
  {
    _id: "650a1b2c3d4e5f6a7b8c9d0e", // 随机生成的ID
    streamer_id: "a01",
    total_viewers: 11
  },
  {
    _id: "650a1b2c3d4e5f6a7b8c9d0f",
    streamer_id: "a02",
    total_viewers: 3
  }
]

优化说明

这个方案是最优的,因为$group是MongoDB专门用于分组聚合的原生操作,性能高效。如果你的events集合数据量较大,建议给streamer_id字段建立索引,进一步提升分组操作的速度。

内容的提问来源于stack exchange,提问作者Amaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:20:28