首页 > 解决方案 > Mongo:如何按 $week 分组,但返回每周的开始日期和结束日期?

问题描述

我按 $week 使用 $group。它返回一年中的#week,但我想要每周的开始日期,结束日期而不是

样本:

当前结果:

[{
    "_id" : 20,
    "averageValue" : null
},
{
    "_id" : 21,
    "averageValue" : 28.1875
}]

预计:

[{
    "_id" : [{ start: "2021-01-01", "end": "2021-01-07" }],
    "averageValue" : null
},
{
    "_id" : [{ start: "2021-01-08", "end": "2021-01-14" }],
    "averageValue" : 28.1875
}]

标签: mongodbgroup-byaggregation-framework

解决方案


尽管它是可行的,但会使代码的可读性降低且更复杂。

我将重写$group阶段以包含yearweeks添加$project阶段以根据要求格式化数据。

db.collection.aggregate([
  {
    "$group": {
      "_id": {
        "week": {
          "$week": {"$subtract": ["$at", 25200000]}  // <-- Changes timezone to -07:00
        },
        "year": {
          "$year": {"$subtract": ["$at", 25200000]}  // <-- Changes timezone to -07:00
        },
      },
      // <-- Add keys to be added in group along with its logics
      "averageValue": {
        "$avg": "$readings.level_1"
      }
    },
  },
  {
    "$project": {
      "_id": {
        "startDate": {
          "$dateToString": {
            "date": {
              "$dateFromParts": {
                "isoWeekYear": "$_id.year",
                "isoWeek": "$_id.week"
              }
            },
            "format": "%Y-%m-%d",
          },
        },
        "endDate": {
          "$dateToString": {
            "date": {
              "$add": [
                {
                  "$dateFromParts": {
                    "isoWeekYear": "$_id.year",
                    "isoWeek": "$_id.week"
                  }
                },
                518400000,
              ],
            },
            "format": "%Y-%m-%d",
          },
        },
      },
      // <-- Add remaining keys to be projected
      "averageValue": 1,
    },
  },
])

让我知道您是否需要解释使用的每个阶段和操作员以及我使用它的原因。

Mongo Playground 示例执行


推荐阅读