当前位置: 首页 > news >正文

MongoDB聚合运算符:$dateFromString

文章目录

    • 语法
    • 使用
      • 使用例子对规则进行说明
      • 格式指示符
    • 举例
      • 日期转换
      • 错误处理onError
        • 空值的粗粒 onNull

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

语法

{ $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:

{ $dateFromString: {dateString: "2017-02-08T12:10:40.787"
} }

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

例2:

{ $dateFromString: {dateString: "2017-02-08T12:10:40.787",timezone: "America/New_York"
} }

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

例3:

{ $dateFromString: {dateString: "2017-02-08"
} }

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

例4:

{ $dateFromString: {dateString: "oct 20 2020"
} }

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

例5:

{ $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")

{ $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
%GISO8601格式 年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
%uISO8601格式的一周内的第几天1-7
%U一年内的第几周(2个数字,0填充)00-53
%VISO8601格式的一年内的第几周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包含下面的数据:

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

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

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

{ "_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") }

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

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

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

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

{ "_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

如果集合文档包含空日期字符串,$dateFromString返回空,除非给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纪元的日期,而不是空值:

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") }

相关文章:

  • SQL中如何添加数据
  • 【kubernetes】关于k8s集群的pod控制器
  • 华为ce12800交换机m-lag(V-STP模式)配置举例
  • OD_2024_C卷_200分_9、园区参观路径【JAVA】【动态规划】
  • 【SpringCloud微服务实战02】Ribbon 负载均衡
  • 是什么原因影响到服务器的稳定性
  • L1阶段题解方法总结
  • 游戏中主流的护甲计算
  • 微信聊天助手
  • HarmonyOS系统开发基础环境搭建
  • 年轻人退休或失业?藏在身边的冷门暴利行业,2024适合年轻人轻资产创业项目!
  • 基于SpringBoot的招聘网站
  • 一键清除JavaScript代码中的注释:使用正则表达式实现
  • 三井住友保险中国区信息技术部负责人陈婧,将出席“ISIG-RPA超级自动化产业发展峰会”
  • Spring事件发布监听器ApplicationListener原理- 观察者模式
  • 《剑指offer》分解让复杂问题更简单
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【面试系列】之二:关于js原型
  • android 一些 utils
  • C++11: atomic 头文件
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • happypack两次报错的问题
  • JavaScript的使用你知道几种?(上)
  • js操作时间(持续更新)
  • Node项目之评分系统(二)- 数据库设计
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Wamp集成环境 添加PHP的新版本
  • Webpack 4x 之路 ( 四 )
  • Zsh 开发指南(第十四篇 文件读写)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 初探 Vue 生命周期和钩子函数
  • 翻译--Thinking in React
  • 基于HAProxy的高性能缓存服务器nuster
  • 讲清楚之javascript作用域
  • 如何选择开源的机器学习框架?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我从编程教室毕业
  • 物联网链路协议
  • const的用法,特别是用在函数前面与后面的区别
  • PostgreSQL之连接数修改
  • ​linux启动进程的方式
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #{}和${}的区别是什么 -- java面试
  • #图像处理
  • (zhuan) 一些RL的文献(及笔记)
  • (二)pulsar安装在独立的docker中,python测试
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)网络优化与超参数选择--九五小庞