MongoDB两个字段的聚合平均值

zqdjd7g9  于 2023-03-17  发布在  Go
关注(0)|答案(2)|浏览(161)

我正在计算我的车队的使用率,计算公式是(以秒计的行车时间+以秒计的空转时间)/ [(一天的总秒数)* 100,即864]。
这是我当前适用于time_moving的聚合管道。如何在其中包含time_idlingtime_movingtime_idling在同一模式中都可用。

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

数据集(两个客户,C1和C2,在两天d1和d2上各自具有两辆车v1和v2的车队):

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... }
liwlm1x9

liwlm1x91#

尝试以下聚合:

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将该值除以秒数。

ubbxdtey

ubbxdtey2#

https://mongoplayground.net/p/mhkW0LlTcI7

db={
  "orders": [
    {
      "_id": 1,
      "item": "almonds",
      "minCompTime": 10,
      "maxCompTime": 20,
      "minCompCost": 10,
      "maxCompCost": 20,
      "quantity": 2
    },
    {
      "_id": 4,
      "item": "pecans",
      "maxCompTime": 20,
      "maxCompCost": 20,
      "quantity": 1
    },
    {
      "_id": 3
    }
  ],
}

db.orders.aggregate([
  {
    "$group": {
      "_id": null,
      "avgCompTime": {
        "$avg": {
          "$divide": [
            {
              "$add": [
                {
                  "$ifNull": [
                    "$minCompTime",
                    "$maxCompTime"
                  ],
                  
                },
                {
                  "$ifNull": [
                    "$maxCompTime",
                    "$minCompTime"
                  ],
                  
                },
                
              ]
            },
            2
          ]
        }
      },
      "avgCompCost": {
        "$avg": {
          "$divide": [
            {
              "$add": [
                {
                  "$ifNull": [
                    "$minCompCost",
                    "$maxCompCost"
                  ],
                  
                },
                {
                  "$ifNull": [
                    "$maxCompCost",
                    "$minCompCost"
                  ],
                  
                },
                
              ]
            },
            2
          ]
        }
      }
    }
  }
])

相关问题