$dateToParts(聚合)
定义
$dateToParts
版本 3.6 中的新增功能。
返回一个文档,包含给定 BSON 日期值各组成部分作为各个属性。返回的属性为
year
、month
、day
、hour
、minute
、second
和millisecond
。您可以将
iso8601
属性设置为true
,以返回表示 ISO 周日期 的部分 相反。这将返回属性为isoWeekYear
、isoWeek
、isoDayOfWeek
、hour
、minute
、second
和millisecond
的文档。$dateToParts
表达式的语法如下:{ $dateToParts: { 'date' : <dateExpression>, 'timezone' : <timezone>, 'iso8601' : <boolean> } } $dateToParts
接受包含以下字段的文档:字段必需/可选说明date
必需timezone
Optional用于设置日期格式的时区。默认情况下,
$dateToParts
使用 UTC。<timezone>
可以是任何计算结果为字符串的表达式,其值为:奥尔森时区标识符,如
"Europe/London"
或"America/New_York"
,或UTC 偏移量,格式如下:
+/-[hh]:[mm]
,例如"+04:45"
,或+/-[hh][mm]
,例如"-0530"
,或+/-[hh]
, e.g."+03"
.
有关表达式的更多信息,请参阅表达式。
iso8601
Optional如果设置为true
,则修改输出文档以使用 ISO 周日期字段。默认为false
。
行为
在 <timezone>
字段中使用 Olson 时区标识符时,如果适用于指定的时区,MongoDB 会应用 DST 偏移量。
例如,考虑包含以下文档的 sales
集合:
{ "_id" : 1, "item" : "abc", "price" : 20, "quantity" : 5, "date" : ISODate("2017-05-20T10:24:51.303Z") }
以下聚合说明了 MongoDB 如何处理 Olson 时区标识符的 DST 偏移量。该示例使用 $hour
和 $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 }
例子
使用以下文档创建 sales
集合:
{ "_id" : 2, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2017-01-01T01:29:09.123Z") }
以下聚合使用 $dateToParts
返回包含 date
字段组成部分的文档。
db.sales.aggregate([ { $project: { date: { $dateToParts: { date: "$date" } }, date_iso: { $dateToParts: { date: "$date", iso8601: true } }, date_timezone: { $dateToParts: { date: "$date", timezone: "America/New_York" } } } }])
操作返回以下结果:
{ "_id" : 2, "date" : { "year" : 2017, "month" : 1, "day" : 1, "hour" : 1, "minute" : 29, "second" : 9, "millisecond" : 123 }, "date_iso" : { "isoWeekYear" : 2016, "isoWeek" : 52, "isoDayOfWeek" : 7, "hour" : 1, "minute" : 29, "second" : 9, "millisecond" : 123 }, "date_timezone" : { "year" : 2016, "month" : 12, "day" : 31, "hour" : 20, "minute" : 29, "second" : 9, "millisecond" : 123 } }