首页 > 解决方案 > MongoDB:如何在 3.6 mongoDb 版本中解析日期?

问题描述

我在这里创建了Mongo Playground

当前输出显示基于 15 分钟时间间隔的结果。(将 updatedAt 值按 15 分钟分组,并显示某些字段的平均值)

目前 $dateToString 和 $dateFromString 正在使用格式来解析日期。我需要让它适用于 mongo 3.6 版(3.6 不支持 $dateFromString 的格式)

 parsedDate: {
              $dateFromString: {
                dateString: "$_id.dateHour",
                format: "%Y-%m-%dT%H"
              }
            }

如果我从 $dateToString 和 $dateFromString 中删除格式字段,查询仍会运行,但“dateHour”的输出显示的值与预期不同。(如下)

"dateHour": ISODate("2020-03-20T18:46:50Z"),

3.6 不支持格式字段。必须使此查询与 3.6 版本兼容。最终输出没有变化。

主要重点是在此更改后获得相同的“dateHour”值。

电流输出:

"dateHour": ISODate("2020-03-19T18:30:00Z"),

预期输出:

"dateHour": ISODate("2020-03-19T18:30:00Z"),

标签: mongodbmongoosemongodb-queryaggregation-framework

解决方案


使用$dateToParts及其对应的$dateFromParts

这是一个更新的游乐场

它所做的基本上是将日期分成几个部分:

{
  $project: {
    dateHour: {
      $dateToParts: {
        date: "$updatedAt"
      }
    }
  }
}

会产生:

{
  "dateHour": {
    "day": 19,
    "hour": 18,
    "millisecond": 0,
    "minute": 21,
    "month": 3,
    "second": 5,
    "year": 2020
  }
}

然后你从它的部分重建日期:

{
  $project: {
    reconstructedDateHour: {
      $dateFromParts: {
        year: "$dateHour.year",
        month: "$dateHour.month",
        day: "$dateHour.day",
        hour: "$dateHour.hour"
      }
    }
  }
}

推荐阅读