Mongo 按周分组是错误的时间吗?

我正在使用聚合与组来计算小时、天或周的最大值。 一切都很好,数小时,数天。但是周组有一些问题。 具体来说,我有一天的记录: 2020-06-03 并且那一天属于 2020 年的第 23 周(从 2020-06-01 到 2020-06-07 的第 23 周)但是 mongo 是返回 2020-06 的值-03 至 2020 年第 22 周

示例:(您可以在这里看到:https://mongoplayground.net/p/T9LeA7jpNLa

这是我的模拟录音:

[
  {
    "dateTime": ISODate("2020-06-03"),"value": 25
  },{
    "dateTime": ISODate("2020-05-25"),"value": 27
  }
]

这是我的查询:

db.collection.aggregate([
  {
    "$match": {
      "dateTime": {
        "$gte": ISODate("2020-05-01"),"$lte": ISODate("2020-07-01")
      }
    }
  },{
    "$group": {
      "_id": {
        "week": {
          "$week": {
            "date": "$dateTime","timezone": "+00:00"
          }
        },"year": {
          "$year": {
            "date": "$dateTime","timezone": "+00:00"
          }
        }
      },"maxValue": {
        "$max": "$value"
      }
    }
  },{
    "$project": {
      "_id": {
        "start": {
          "$dateToString": {
            "date": {
              "$dateFromParts": {
                "isoWeekYear": "$_id.year","isoWeek": "$_id.week"
              }
            },"format": "%Y-%m-%d"
          }
        },"end": {
          "$dateToString": {
            "date": {
              "$add": [
                {
                  "$dateFromParts": {
                    "isoWeekYear": "$_id.year","isoWeek": "$_id.week"
                  }
                },518400000
              ]
            },"format": "%Y-%m-%d"
          }
        }
      },"maxValue": "$maxValue"
    }
  }
])

结果:

[
  {
    "_id": {
      "end": "2020-05-24","start": "2020-05-18"
    },"maxValue": 27
  },{
    "_id": {
      "end": "2020-05-31","start": "2020-05-25"
    },"maxValue": 25
  }
]

我的期望:

[
  {
    "_id": {
      "end": "2020-05-31",{
    "_id": {
      "end": "2020-06-01","start": "2020-06-07"
    },"maxValue": 25
  }
]
wsk520520 回答:Mongo 按周分组是错误的时间吗?

来自official document

以 0 到 53 之间的数字形式返回日期的一年中的第几周。

周从星期日开始,第 1 周从一年中的第一个星期日开始。一年中第一个星期日之前的天数在第 0 周。此行为与 strftime 标准库函数的“%U”运算符相同。

周数是从零开始的,而不是我们在日常生活中使用的从一开始。

因此,对于 2020 年的情况,第 0 周应为 2020-01-01 至 2020-01-05,第 1 周应为 2020-01-06 至 2020-01-12。这也解释了第 53 周,即 2020-12-27 至 2020-12-31。

如 OP 所确定的,聚合应更改为使用 $isoWeek

Mongo playground

本文链接:https://www.f2er.com/16868.html

大家都在问