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

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
    }
  }
])

代码解释

  1. $project生成比值数组:使用$map遍历powerMetrics数组,对每个元素计算powerConsumption/duration,生成一个新的数组ratioArray,每个元素都是对应的功耗比值。
  2. $unwind拆分数组:将ratioArray拆分成独立的文档,这样后续可以用$avg对所有比值进行平均计算。
  3. $group计算平均值:按原文档的_id分组(确保每个原文档对应唯一的结果),用$avg聚合所有拆分后的比值,得到平均值并命名为avgMetric。
  4. $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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:08