【问题标题】:How do we calculate a monthly average value in MongoDB?我们如何计算 MongoDB 中的月平均值?
【发布时间】:2023-01-09 22:45:38
【问题描述】:

我在 Mongo 中有一个文档列表,每个文档都包含当天某项服务的指标值。方案如下:

    _id: ObjectId("..."),
    name: '<some_metric_name>',
    service: '<service_name>',
    timestamp_unix: Long("1635033600000"),
    timestamp: '2021-10-24 03:00:00 +0300 EEST',
    value: 99.9810785241248
  },

我想在 Redash 中有一个仪表板,我可以在其中查看按服务分组的每月这些值的计算平均值。

例如在 4 个月的时间里,它应该是这样的:

| service       | date                     | avg
| my_svc        | 01-01-2022 to 31-01-2022 | 99.500
| my_svc        | 01-02-2022 to 28-02-2022 | 99.100
| my_svc        | 01-03-2022 to 31-03-2022 | 99.400
| my_svc        | 01-04-2022 to 30-04-2022 | 99.900
| my_svc_total  | 01-01-2022 to 30-04-2022 | 99.475
| my_svc_2      | 01-01-2022 to 31-01-2022 | 99.150
.
.
.

所以我需要一个按月聚合文档的查询,计算平均值并按月和服务对它们进行分组。到目前为止,我有这个可以计算总体平均值:

{
    "collection": "metrics",
    "aggregate": [
        {
            "$group": {
                "_id": {
                    "$dateToString": {
                        "format": "%Y-%m-%d",
                        "date": {
                            "$toDate": "$timestamp_unix"
                        }
                    }
                },
                "total_average": {
                    "$avg": "$value"
                }
            }
        }
    ]
}

那么我将如何着手实施呢?

【问题讨论】:

    标签: mongodb redash


    【解决方案1】:

    我认为您希望按月+年和服务对数据进行分组。所以你应该把这两个条件都放在你的小组赛阶段。然后,您可以像以前一样用累加器求平均值。

    {
        "collection": "metrics",
        "aggregate": [
            {
                "$group": {
                    "_id": {
                        "service" : "$service",
                        "month" : 
                            { "$dateToString": {
                                "format": "%Y-%m",
                                "date": {
                                    "$toDate": "$timestamp_unix"
                                }
                            }
                        }
                    },
                    "average": {
                        "$avg": "$value"
                    }
                }
            },
            { "$project" : 
                {"service" : "$_id.service",
                 "year-month":"$_id.month", 
                 "average":1, 
                 "_id":0
                }
            }
        ]
    }
    

    这应该给你你想要的数据。

    如果您还想要每项服务的总平均值,我建议您使用 $facet 阶段并执行完全相同的小组阶段,但没有日期条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多