从基于对象字段

时间:2018-01-08 11:53:14

标签: mongodb mongodb-query aggregation-framework

我有一份以下结构的文件:

{
    "_id" : ObjectId("598446bb13c7141f1"),
    "trackerId" : "598446ba-fa9b-4000-8000-4ea290e",
    "powerMetrics" : [ 
        {
            "duration" : 0.15,
            "powerConsumption" : 0.1
        }, 
        {
            "duration" : 0.1,
            "powerConsumption" : 0.05
        }
    ]
}

我的目标是获取另一个文档,其中包含单个值avgMetric。应使用powerMetrics数组以下列方式计算此avgMetrics

    (powerMetrics[0].powerConsumption/powerMetrics[0].duration 
  + powerMetrics[1].powerConsumption/powerMetrics[1].duration) /  powerMetrics.size()

因此,此avgMetrics应代表powerMetrics数组中所有(powerConsumption / duration)的平均值。

在尝试查询后,我无法实现这一目标,

powerMetrics数组的大小可能不同,Mongo db版本为3.2.14

有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用$map$avg一起输出3.2 mongo版本的平均值。

db.col_name.aggregate(
[{"$project":{
  "avgMetrics":{
    "$avg":{
      "$map":{
        "input":"$powerMetrics",
         "as":"val",
         "in":{"$divide":["$$val.powerConsumption","$$val.duration"]}
      }
    }
  }
}}])

答案 1 :(得分:0)

db.collection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $unwind: {
                path: "$powerMetrics",
                preserveNullAndEmptyArrays: true // optional
            }
        },

        // Stage 2
        {
            $group: {
                _id: '$_id',
                metrics: {
                    $addToSet: {
                        $divide: ['$powerMetrics.powerConsumption', '$powerMetrics.duration']
                    }
                }
            }
        },

        // Stage 3
        {
            $project: {
                avgVal: {
                    $avg: '$metrics'
                }
            }
        },

    ]



);