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 } } ])
代码解释
$group阶段:
_id: "$streamer_id":指定以streamer_id作为分组键,确保同个主播的所有文档被归为一组streamer_id: { $first: "$streamer_id" }:从每组中取出第一个streamer_id值,保证输出结果中包含该字段total_viewers: { $sum: "$viewers" }:使用$sum累加每组内所有文档的viewers值,得到该主播的总观众数
可选$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
相关产品推荐
相关产品推荐

