MongoDB聚合运算符:$dateFromString

文章目录

$dateFromString聚合运算符将日期时间字符串转换为日期对象。

语法

js 复制代码
{ $dateFromString: {
     dateString: <dateStringExpression>,
     format: <formatStringExpression>,
     timezone: <tzExpression>,
     onError: <onErrorExpression>,
     onNull: <onNullExpression>
} }

参数字段说明:

字段 必须 说明
dateString 如果没有用isoWeekYear则必须 日历年度,可以是任何能解析为整数的表达式,值域为:1~9999,如果超出范围将报错。从4.4以后最小值为1,再之前的版本最小值是0
format 若year没有用则必须 ISO的周日期年,可以是任何能解析为整数的表达式,值域为:1~9999,如果超出将报错。从4.4以后最小值为1,再之前的版本最小值是0
timezone 可选 执行操作的时区,<timezone>可以是任何能被解析为:Olson时区标识符或UTC偏移量
onError 可选 在解析dateString时如果出错,则输出onError表达式的结果,结果值可以是任意类型
onNull 可选 如果dateStringnull或不存在,则输出onNull表达式的结果,可以是任意类型

使用

使用例子对规则进行说明

例1:

js 复制代码
{ $dateFromString: {
    dateString: "2017-02-08T12:10:40.787"
} }

结果:ISODate("2017-02-08T12:10:40.787Z")

例2:

js 复制代码
{ $dateFromString: {
     dateString: "2017-02-08T12:10:40.787",
     timezone: "America/New_York"
} }

结果:ISODate("2017-02-08T12:10:40.787Z")

例3:

js 复制代码
{ $dateFromString: {
     dateString: "2017-02-08"
} }

结果:ISODate("2017-02-08T00:00:00Z")

例4:

js 复制代码
{ $dateFromString: {
     dateString: "oct 20 2020"
} }

结果:ISODate("2020-10-20T00:00:00.000Z")

例5:

js 复制代码
{ $dateFromString: {
     dateString: "06-15-2018",
     format: "%m-%d-%Y"
} }

结果:ISODate("2018-06-15T00:00:00Z")

例6:

{ $dateFromString: {
     dateString: "15-06-2018",
     format: "%d-%m-%Y"
} }

结果:ISODate("2018-06-15T00:00:00Z")

js 复制代码
{ $dateFromString: {
     dateString: "WED jan 31 12:05:28 +03:30 1996"
} }

结果:ISODate("1996-01-31T08:35:28.000Z")

格式指示符

指示符 描述 可能的值
%b 月份缩写(3个字符) jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
%B 完整月份 january-december
%d 一个月内的第几天(2个数字,0填充) 01-31
%G ISO8601格式 年 0000-9999
%H 小时(2个数字,0填充,24小时时钟) 00-23
%j 一年内的第几天(3个数字,0填充) 001-366
%L 毫秒(3个数字,0填充) 000=999
%m 月(2个数字,0填充) 01-12
%M 分钟(2个数字,0填充) 00-59
%S 秒(2个数字,0填充) 00-60
%u ISO8601格式的一周内的第几天 1-7
%U 一年内的第几周(2个数字,0填充) 00-53
%V ISO8601格式的一年内的第几周 1-53
%w 一周内的第几天(整数,0-Sunday,6-Saturday) 0-6
%Y 年(4个数字,0填充) 0000-9999
%z 时区与UTC的偏移量 +/-[hh][mm]
%Z 从 UTC 开始的分钟偏移量,用数字表示。例如,如果时区偏移(+/-[hhmm])为 +0445,则分钟偏移为+285 +/-mmm
%% 百分比字符作为字面值 %

举例

日期转换

集合logmessages包含下面的数据:

js 复制代码
{ _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将日期值转换为日期对象:

js 复制代码
db.logmessages.aggregate( [ {
   $project: {
      date: {
         $dateFromString: {
            dateString: '$date',
            timezone: 'America/New_York'
         }
      }
   }
} ] )

上述汇总返回以下文档,并将每个日期字段转换为东部时区:

json 复制代码
{ "_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") }

也可以通过文档字段提供时区参数,而不是硬编码参数。例如:

js 复制代码
db.logmessages.aggregate( [ {
   $project: {
      date: {
         $dateFromString: {
            dateString: '$date',
            timezone: '$timezone'
         }
      }
   }
} ] )

上述汇总返回以下文档,并将每个date字段转换为各自的 UTC 表示形式。

json 复制代码
{ "_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

如果文档集中包含不可解析日期字符串的文档,则$dateFromString会出错,除非给参数onError提供一个聚合表达式。

例如,给定一个包含以下文档的日期集合:

json 复制代码
{ "_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参数以原始字符串形式返回无效日期:

js 复制代码
db.dates.aggregate( [ {
   $project: {
      date: {
         $dateFromString: {
            dateString: '$date',
            timezone: '$timezone',
            onError: '$date'
         }
      }
   }
} ] )

返回的文档如下:

json 复制代码
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") }
{ "_id" : 2, "date" : "20177-02-09T03:35:02.055" }
空值的粗粒 onNull

如果集合文档包含空日期字符串,$dateFromString返回空,除非给onNull指定一个聚合表达式。

例如,集合dates有以下文档:

json 复制代码
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" },
{ "_id" : 2, "date" : null, timezone: "America/New_York" }

可以使用onNUll参数让$dateFromString返回代表unix纪元的日期,而不是空值:

js 复制代码
db.dates.aggregate( [ {
   $project: {
      date: {
         $dateFromString: {
            dateString: '$date',
            timezone: '$timezone',
            onNull: new Date(0)
         }
      }
   }
} ] )

返回下面的结果:

json 复制代码
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") }
{ "_id" : 2, "date" : ISODate("1970-01-01T00:00:00Z") }
相关推荐
Islucas1 小时前
入门Django
数据库·django·sqlite
jnrjian1 小时前
update 强制 NEST_LOOP NL 的理解,被驱动表 inner table
数据库·sql·oracle
新知图书1 小时前
SQL Server 2022的数据类型
数据库·oracle
脑子不好真君2 小时前
MongoDB的备份和恢复命令
数据库·mongodb
鲁鲁5172 小时前
梧桐数据库(WuTongDB):PostgreSQL 优化器简介
数据库·postgresql·梧桐数据库
极客先躯2 小时前
高级java每日一道面试题-2024年9月15日-架构篇[分布式篇]-如何在分布式系统中实现事务?
java·数据库·分布式·面试·架构·事务·分布式篇
脑子不好真君2 小时前
使用cmd命令窗口操作mongodb
数据库·mongodb
椅子哥3 小时前
MyBatis操作数据库-XML实现
xml·java·数据库·spring boot·mybatis
青碧凝霜3 小时前
redis单点、主从、哨兵、集群的不同
数据库·redis·缓存
小马爱打代码4 小时前
MongoDB的安装和使用
数据库·mongodb