MongoDB聚合两个字段的平均值

时间:2018-03-29 05:32:26

标签: mongodb aggregation-framework

我正在尝试计算我的车队的利用率。这样做的公式是(以秒为单位移动的时间+以秒为单位的空闲时间)/ [(一天中的总秒数)* 100,即864]。

这是我当前的聚合管道,适用于time_moving。如何在其中加入time_idlingtime_movingtime_idling都可以在同一架构中使用。

{"$group": {
    "_id": {
        "customer": "$customer",
        "date": "$date"
    },
    "percentage": {
        "$avg": {"$divide": ["$time_moving", 864]}
    }
}}

数据集(两个客户,c1和c2,每个车队有两辆车,v1和v2,两天,d1和d2):

customer    date        time_moving     time_idling vehicle
c1          d1           8200           400         v1
c1          d1          28200             0         v2
c2          d1           6400           800         v1
c2          d1          19900           100         v2
c1          d2          65500           500         v1
c1          d2           9800           100         v2
c2          d2          55000           200         v1
c2          d2          13000           200         v2

示例输出(或具有相同数据点的不同结构化输出):

{ "_id" : { "customer" : "c1", "date" : "d1" }, "percentage" : 42.59... }
{ "_id" : { "customer" : "c1", "date" : "d2" }, "percentage" : 87.84... }
{ "_id" : { "customer" : "c2", "date" : "d1" }, "percentage" : 31.48... }
{ "_id" : { "customer" : "c2", "date" : "d2" }, "percentage" : 79.16... }

1 个答案:

答案 0 :(得分:1)

尝试以下聚合:

db.col.aggregate([
    {
        $group: {
            _id: { "customer": "$customer", "date": "$date" },
            percentage: { $sum: { $add: [ "$time_moving", "$time_idling" ] } }
        }
    },
    {
        $addFields: {
            percentage: {
                $divide: [ "$percentage", 864 ]
            }
        }
    }
])

您可以使用$sum获取每个组的所有time_movingtime_idling,然后使用$divide将该值除以秒数。