$dateFromParts (aggregation)

在本页面

定义

$dateFromParts

3.6版的新功能。

给定日期的组成属性,构造并返回Date对象。

$dateFromParts表达式具有以下语法:

{
    $dateFromParts : {
        'year': <year>, 'month': <month>, 'day': <day>,
        'hour': <hour>, 'minute': <minute>, 'second': <second>,
        'millisecond': <ms>, 'timezone': <tzExpression>
    }
}

您还可以 使用以下语法以ISO周日期格式指定组成日期字段 :

{
    $dateFromParts : {
        'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>,
        'hour': <hour>, 'minute': <minute>, 'second': <second>,
        'millisecond': <ms>, 'timezone': <tzExpression>
    }
}

$dateFromParts需要具有以下字段的文档:

重要

构造$dateFromParts输入文档时,不能将日历日期字段和ISO周日期字段组合使用。

字段
必选/可选
描述

year

如果不使用isoWeekYear,则为必需的

公历年。可以是任何计算结果为数字的表达式。 值范围:0-9999

isoWeekYear

如果不使用year,是必需的

ISO周日期年份。可以是任何计算结果为数字的表达式。 值范围: 0-9999

month

可选。只能与year一起使用。

month。可以是任何计算结果为数字的表达式。 默认为1。 值范围:1-12 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

isoWeek

可选。只能与isoWeekYear一起使用。

一年中的一周。可以是任何计算结果为数字的表达式。 默认为1。 值范围:1-53 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

day

可选的。只能与year一起使用。

一个月中的某天。可以是任何计算结果为数字的表达式。 默认为1。 值范围: 1-31 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

isoDayOfWeek

可选。只能与isoWeekYear一起使用。

星期几(星期一1-星期日7)。可以是任何计算结果为数字的表达式。 默认为1。 值范围:1-7 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

hour

可选

<hour>可以是任何计算结果为数字的表达式。 默认为0。 值范围: 0-23 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

minute

可选

<minute>可以是任何计算结果为数字的表达式。 默认为0。 值范围: 0- 59 从MongoDB 4.0开始,如果指定的数字超出此范围,$dateFromParts则将日期计算中的差值纳入考虑范围。有关示例,请参见值范围。

second

可选

<second>可以是任何计算结果为数字的表达式。 默认为0。 值范围:0-59 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

millisecond

可选

<millisecond>。可以是任何计算结果为数字的表达式。 默认为0。 值范围: 0-999 从MongoDB 4.0开始,如果指定的数字超出此范围,则会$dateFromParts在日期计算中纳入差异。有关示例,请参见值范围。

timezone

可选

<timezone>可以是任何表达式,其值是字符串,其值可以是: 一个奥尔森时区标识符,例如"Europe/London""America/New_York" UTC偏移量,格式为: 1. +/-[hh]:[mm],例如"+04:45" 2. +/-[hh][mm],例如"-0530" 3. +/-[hh]例如"+03" 有关表达式的更多信息,请参见 表达式。

行为

值范围

在MongoDB中4.0开始,如果比其它字段中指定的值 yearisoYeartimezone是在有效范围之外, $dateFromParts携带或减去从其它日期的差来计算的日期。

值大于范围

考虑以下$dateFromParts表达式,其中month字段值为14,比12个月(或1年)的最大值大2个月:

{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12  } }

该表达式通过将year乘以1并将设置month为2来返回来计算日期:

ISODate("2018-02-01T12:00:00Z")

值小于的范围

考虑以下$dateFromParts表达式,其中month字段值为0,比最小值1个月小1个月:

{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12  } }

该表达式通过将减少year1并将设置month为12来返回,以计算日期:

ISODate("2016-12-01T12:00:00Z")

时区

<timezone> 字段中使用Olson时区标识符时,如果适用于指定的时区,MongoDB将应用DST偏移量。

例如,考虑sales包含以下文档的集合:

{
   "_id" : 1,
   "item" : "abc",
   "price" : 20,
   "quantity" : 5,
   "date" : ISODate("2017-05-20T10:24:51.303Z")
}

以下汇总说明了MongoDB如何处理Olson时区标识符的DST偏移量。该示例使用 $hourand $minute运算符返回date字段的相应部分:

db.sales.aggregate([
{
   $project: {
      "nycHour": {
         $hour: { date: "$date", timezone: "-05:00" }
       },
       "nycMinute": {
          $minute: { date: "$date", timezone: "-05:00" }
       },
       "gmtHour": {
          $hour: { date: "$date", timezone: "GMT" }
       },
       "gmtMinute": {
          $minute: { date: "$date", timezone: "GMT" } },
       "nycOlsonHour": {
          $hour: { date: "$date", timezone: "America/New_York" }
       },
       "nycOlsonMinute": {
          $minute: { date: "$date", timezone: "America/New_York" }
       }
   }
}])

该操作返回以下结果:

{
   "_id": 1,
   "nycHour" : 5,
   "nycMinute" : 24,
   "gmtHour" : 10,
   "gmtMinute" : 24,
   "nycOlsonHour" : 6,
   "nycOlsonMinute" : 24
}

例子

以下聚合用于$dateFromParts从提供的输入字段构造三个日期对象:

db.sales.aggregate([
{
   $project: {
      date: {
         $dateFromParts: {
            'year' : 2017, 'month' : 2, 'day': 8, 'hour' : 12
         }
      },
      date_iso: {
         $dateFromParts: {
            'isoWeekYear' : 2017, 'isoWeek' : 6, 'isoDayOfWeek' : 3, 'hour' : 12
         }
      },
      date_timezone: {
         $dateFromParts: {
            'year' : 2016, 'month' : 12, 'day' : 31, 'hour' : 23,
            'minute' : 46, 'second' : 12, 'timezone' : 'America/New_York'
         }
      }
   }
}])

该操作返回以下结果:

{
  "_id" : 1,
  "date" : ISODate("2017-02-08T12:00:00Z"),
  "date_iso" : ISODate("2017-02-08T12:00:00Z"),
  "date_timezone" : ISODate("2017-01-01T04:46:12Z")
}

译者:李冠飞

校对:

最后更新于