MongoDB聚合:如何获取字段数组并计算sessionDuration平均值
解决方案
一、获取sessionDuration字段的数组
要把所有文档的sessionDuration值收集到一个数组中,可使用聚合框架的$group阶段配合$push操作符实现:
db.yourCollectionName.aggregate([ { $group: { _id: null, // 按null分组将所有文档归为同一组 durationsArr: { $push: "$sessionDuration" } // 将每个文档的sessionDuration推入数组 } } ])
执行后返回结果格式如下:
{ "_id": null, "durationsArr": [29, 45, 25] }
关键说明:
_id: null是核心设置,确保所有文档被合并到同一个分组,才能收集全量的sessionDuration值。$push操作符会逐个将指定字段的值添加到目标数组中。
二、更优的平均值计算方案
先存数组再算平均值的方法可行,但直接用$avg操作符一步计算平均值性能更优,尤其在数据量较大时,能避免数组存储带来的额外内存开销:
直接计算平均值的聚合管道
db.yourCollectionName.aggregate([ { $group: { _id: null, averageSessionDuration: { $avg: "$sessionDuration" } // 实时计算所有sessionDuration的平均值 } } ])
执行后结果示例:
{ "_id": null, "averageSessionDuration": 33 // (29+45+25)/3 = 33 }
优势解析:
- 内存效率更高:无需在内存中存储所有
sessionDuration值的数组,MongoDB会在分组过程中实时累加计算,占用内存更少。 - 执行速度更快:省去了数组存储和后续遍历计算的步骤,一步完成统计。
如果需要同时获取数组和平均值,也可在同一个$group阶段中完成:
db.yourCollectionName.aggregate([ { $group: { _id: null, durationsArr: { $push: "$sessionDuration" }, averageSessionDuration: { $avg: "$sessionDuration" } } } ])
内容的提问来源于stack exchange,提问作者Mohammad Farhan
相关产品推荐
相关产品推荐

