$dateFromString(聚合)
定义
$dateFromString
版本 3.6 中的新增功能。
将日期/时间字符串转换为日期对象。
$dateFromString
表达式的语法如下:{ $dateFromString: { dateString: <dateStringExpression>, format: <formatStringExpression>, timezone: <tzExpression>, onError: <onErrorExpression>, onNull: <onNullExpression> } } $dateFromString
接受包含以下字段的文档:字段说明dateString
要转换为日期对象的日期/时间string 。 有关日期/时间格式的更多信息,请参阅日期。
如果为该操作符指定
timezone
选项,请勿在dateString
中包含时区信息。format
可选。 的日期格式规范。
dateString
format
可以是任何计算结果为字符串文字的表达式,并包含0 或更多格式说明符。有关可用说明符的列表,请参阅格式说明符。如果未指定,
$dateFromString
会使用"%Y-%m-%dT%H:%M:%S.%LZ"
作为默认格式,但也接受各种格式,并在可能的情况下尝试解析dateString
。timezone
可选。用于设置日期格式的时区。
如果
dateString
参数的格式类似于“2017-02-08T12:10:40.787Z”,其中末尾的“Z”表示祖鲁时间(UTC 时区),则无法指定timezone
参数。<timezone>
允许使用以下选项以及对其进行计算的表达式:Olson 时区标识符 ,例如
"Europe/London"
或"America/New_York"
,或者UTC 偏移量,格式如下:
+/-[hh]:[mm]
,例如"+04:45"
,或+/-[hh][mm]
,例如"-0530"
,或+/-[hh]
,例如"+03"
,或
字符串
"Z"
、"UTC"
或"GMT"
有关表达式的更多信息,请参阅表达式。
onError
可选。如果
$dateFromString
在解析给定dateString
时遇到错误,则会输出所提供onError
表达式的结果值。此结果值可以是任何类型。如果未指定
onError
,$dateFromString
将在无法解析dateString
时引发错误。onNull
可选。如果提供给
dateString
的$dateFromString
为null
或缺失,则输出所提供的onNull
表达式的结果值。此结果值可以是任何类型。如果未指定
onNull
且 为dateString
null
或缺失,则$dateFromString
输出null
。
行为
例子 | 结果 | ||||
---|---|---|---|---|---|
|
| ||||
|
| ||||
|
| ||||
|
| ||||
|
| ||||
|
|
格式描述符
<formatString>
中可使用以下格式说明符:
说明符 | 说明 | Possible Values |
---|---|---|
| 月中的某一天(2 位数字,补零) |
|
| ISO 8601 格式的年份 |
|
| 小时(2 位数字,填充零,24 小时时钟) |
|
| 毫秒(3 位数字,填充零) |
|
| 月份(2 位数字,补零) |
|
| 分钟(2 位数字,填充零) |
|
| 第二(2 位数字,补零) |
|
| 一周中每天的编号(采用 ISO 8601 格式,1-星期一,7-星期日) |
|
| ISO 8601 格式的年中的某一周 |
|
| 年份(4 位数字,补零) |
|
| 与 UTC 的时区偏移。 |
|
| 从 UTC 开始偏移的分钟数。例如,如果时区偏移 ( |
|
| 作为文本的百分比字符 |
|
示例
转换日期
以一个包含以下文档(附带日期)的集合 logmessages
为例。
{ _id: 1, date: "2017-02-08T12:10:40.787", timezone: "America/New_York", message: "Step 1: Started" }, { _id: 2, date: "2017-02-08", timezone: "-05:00", message: "Step 1: Ended" }, { _id: 3, message: " Step 1: Ended " }, { _id: 4, date: "2017-02-09", timezone: "Europe/London", message: "Step 2: Started"}, { _id: 5, date: "2017-02-09T03:35:02.055", timezone: "+0530", message: "Step 2: In Progress"}
以下聚合使用 $dateFromString 将 date
值转换为日期对象:
db.logmessages.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: 'America/New_York' } } } } ] )
上述聚合会返回以下文档,并将每个 date
字段转换为东部时区:
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("2017-02-08T05:00:00Z") } { "_id" : 3, "date" : null } { "_id" : 4, "date" : ISODate("2017-02-09T05:00:00Z") } { "_id" : 5, "date" : ISODate("2017-02-09T08:35:02.055Z") }
timezone
参数也可以通过文档字段提供,而不是硬编码参数。例如:
db.logmessages.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone' } } } } ] )
上述聚合返回以下文档,并将每个 date
字段转换为其各自的 UTC 表示。
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("2017-02-08T05:00:00Z") } { "_id" : 3, "date" : null } { "_id" : 4, "date" : ISODate("2017-02-09T00:00:00Z") } { "_id" : 5, "date" : ISODate("2017-02-08T22:05:02.055Z") }
onError
如果集合包含带有不可解析日期字符串的文档,则除非您为可选的 onError
参数提供聚合表达式,否则 $dateFromString
会引发错误。
例如,假设有一个包含以下文档的集合 dates
:
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" }, { "_id" : 2, "date" : "20177-02-09T03:35:02.055", timezone: "America/New_York" }
您可以使用 onError
参数以原始字符串形式返回无效的日期:
db.dates.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone', onError: '$date' } } } } ] )
这将返回以下文档:
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : "20177-02-09T03:35:02.055" }
onNull
如果您的集合包含 null
日期字符串的文档,$dateFromString
将返回 null
,除非您为可选的 onNull
参数提供了聚合表达式。
例如,假设有一个包含以下文档的集合 dates
:
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" }, { "_id" : 2, "date" : null, timezone: "America/New_York" }
您可以使用 onNull
参数让 $dateFromString
返回一个代表 unix 纪元的日期,而不使用 null
:
db.dates.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone', onNull: new Date(0) } } } } ] )
这将返回以下文档:
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("1970-01-01T00:00:00Z") }