MongoDB 3.2.14:如何计算对象数组中指定字段的平均值并生成文档
解决方案:MongoDB 3.2.14计算powerMetrics数组的平均功耗比值
针对你在MongoDB 3.2.14版本中的需求,我们可以通过聚合管道组合几个基础操作符来实现目标——计算powerMetrics数组中每个元素powerConsumption/duration的平均值,并只返回包含avgMetric字段的文档。
完整聚合查询代码
db.yourCollectionName.aggregate([ // 第一步:将数组中每个元素转换为功耗比值 { $project: { ratioArray: { $map: { input: "$powerMetrics", as: "metric", in: { $divide: ["$$metric.powerConsumption", "$$metric.duration"] } } } } }, // 第二步:将比值数组拆分为单个文档 { $unwind: "$ratioArray" }, // 第三步:按原文档ID分组,计算比值的平均值 { $group: { _id: "$_id", avgMetric: { $avg: "$ratioArray" } } }, // 第四步:仅保留avgMetric字段,移除_id { $project: { _id: 0, avgMetric: 1 } } ])
代码解释
- $project生成比值数组:使用
$map遍历powerMetrics数组,对每个元素计算powerConsumption/duration,生成一个新的数组ratioArray,每个元素都是对应的功耗比值。 - $unwind拆分数组:将
ratioArray拆分成独立的文档,这样后续可以用$avg对所有比值进行平均计算。 - $group计算平均值:按原文档的
_id分组(确保每个原文档对应唯一的结果),用$avg聚合所有拆分后的比值,得到平均值并命名为avgMetric。 - $project过滤字段:最后只保留
avgMetric字段,移除默认保留的_id,得到你需要的结果结构。
针对示例文档的验证
对于你提供的示例文档:
{ "_id" : ObjectId("598446bb13c7141f1"), "trackerId" : "598446ba-fa9b-4000-8000-4ea290e", "powerMetrics" : [ { "duration" : 0.15, "powerConsumption" : 0.1 }, { "duration" : 0.1, "powerConsumption" : 0.05 } ] }
计算过程为:
- 第一个比值:
0.1 / 0.15 ≈ 0.6667 - 第二个比值:
0.05 / 0.1 = 0.5 - 平均值:
(0.6667 + 0.5) / 2 ≈ 0.5833
查询返回的结果将是:
{ "avgMetric" : 0.5833333333333334 }
额外说明
如果你的集合中存在powerMetrics为空数组的文档,上述查询会返回avgMetric: null。如果需要过滤这类文档,可以在聚合管道最开头添加一个$match阶段:
{ $match: { powerMetrics: { $ne: [], $exists: true } } }
内容的提问来源于stack exchange,提问作者Andrey Yaskulsky
相关产品推荐
相关产品推荐

