$dateFromParts (聚合)
定义
$dateFromParts
根据日期的组成部分构造并返回一个Date对象。
该
$dateFromParts
表达式具有以下语法{ $dateFromParts : { 'year': <year>, 'month': <month>, 'day': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } 您还可以使用以下语法指定您的组成部分日期字段,格式如下
{ $dateFromParts : { 'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } $dateFromParts
接受以下字段的文档重要
当构造您的
$dateFromParts
输入文档时,您不能同时使用日历日期和ISO周日期字段。字段必需/可选描述year
如果未使用isoWeekYear
则必需isoWeekYear
如果未使用year
则必须提供month
可选。只能与year
一起使用。isoWeek
可选。只能与isoWeekYear
一起使用。day
可选。只能与year
一起使用。isoDayOfWeek
可选。只能与isoWeekYear
一起使用。星期中的日(周一
1
- 周日7
)。可以是任何计算结果为数字的 表达式。默认为
1
。值范围:
如果指定的数字超出此范围,则1
-7
$dateFromParts
在日期计算中将包含差异。请参阅 值范围 以获取示例。hour
可选minute
可选second
可选millisecond
可选timezone
可选<timezone>
可以是任何计算结果为字符串的 表达式,其值可以是一个Olson时区标识符,例如
"Europe/London"
或"America/New_York"
,或者以形式表示的UTC偏移量
+/-[hh]:[mm]
,例如"+04:45"
,或者+/-[hh][mm]
,例如"-0530"
,或者+/-[hh]
,例如"+03"
。
有关表达式的更多信息,请参阅表达式运算符。
行为
值范围
year
和isoWeekYear
的支持值范围是1-9999
。
如果为除year
、isoWeekYear
和timezone
之外的字段指定的值超出了有效范围,$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 } }
表达式通过将year
减少1年并将month
设置为12来计算日期
ISODate("2016-12-01T12:00:00Z")
时区
在使用Olson时区标识符作为<timezone>
字段时,MongoDB将应用指定时区的DST偏移量(如果适用)DST偏移量
例如,考虑一个具有以下文档的 销售
集合
{ "_id" : 1, "item" : "abc", "price" : 20, "quantity" : 5, "date" : ISODate("2017-05-20T10:24:51.303Z") }
以下聚合示例说明了 MongoDB 如何处理 Olson 时区标识符的 DST 偏移量。示例使用 $hour
和 $minute
操作符来返回 日期
字段的相应部分
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") }