MongoDB聚合运算符:$dateAdd

文章目录

    • 语法
    • 使用
      • 时间测量
      • 时区
    • 举例
      • 添加未来日期
      • 根据日期范围筛选
      • 调整夏令时

$dateAdd聚合运算符将Date()对象按指定的时间单位递增。

语法

{$dateAdd: {startDate: <Expression>,unit: <Expression>,amount: <Expression>,timezone: <tzExpression>}
}

返回一个日期对象Date()startDate可以是任何能被解析为日期、时间戳或对象Id的表达式,这三种类型都会返回Date()对象。

参数字段说明:

|字段|是否必须|描述|
|-|-|
|startDate|是|开始日期(UTC),可以是日期、时间戳或对象Id表达式|
|unit|是|要增加的时间的单位,单位可以是能被解析为下列值的表达式:yearquarterweekmonthdayhourminutesecondmillisecond|
|amount|是|以units为单位,在startDate基础上的增量,amount是可以被解析为整数、小数或双精度数的表达式|
|timezone|否|执行操作的时区,<tzExpression>必须是能被解析为奥尔森时区标识符格式的字符串或UTC偏移量,如果timezone不指定,返回值显示为UTC|

使用

时间测量

MongoDB遵循流行的数据库用法,以 UTC 为时间单位工作。dateAdd表达式总是以 UTC 为起始日期,并以 UTC 为结果返回。如果指定了时区,计算将使用指定的时区进行。当计算涉及夏令时(DST)时,时区尤为重要。

如果单位是一个月或更大,操作会根据该月的最后一天进行调整。例如,在 10 月的最后一天增加一个月,这就是 "月末最后一天 "调整。

{$dateAdd:{startDate: ISODate("2020-10-31T12:10:05Z"),unit: "month",amount: 1}
}

注意:返回的日期ISODate("2020-11-30T12:10:05Z")是30日,而不是 31日,因为11月的天数比10月少。

时区

<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操作符返回日期字段的相应部分:

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
}

举例

添加未来日期

shipping集合中包括了顾客订单的日期:

db.shipping.insertMany([{ custId: 456, purchaseDate: ISODate("2020-12-31") },{ custId: 457, purchaseDate: ISODate("2021-02-28") },{ custId: 458, purchaseDate: ISODate("2021-02-26") }]
)

假设正常发货时间为3天。您以在聚合管道中使用$dateAdd来设置3天后的预期交货日期:

db.shipping.aggregate([{$project:{expectedDeliveryDate:{$dateAdd:{startDate: "$purchaseDate",unit: "day",amount: 3}}}},{$merge: "shipping"}])

$project阶段用$dateAdd将购买日期增加3天后,$merge阶段用 expectedDeliveryDate更新原始文档。

最后得到的文档如下:

{"_id" : ObjectId("603dd4b2044b995ad331c0b2"),"custId" : 456,"purchaseDate" : ISODate("2020-12-31T00:00:00Z"),"expectedDeliveryDate" : ISODate("2021-01-03T00:00:00Z")
}
{"_id" : ObjectId("603dd4b2044b995ad331c0b3"),"custId" : 457,"purchaseDate" : ISODate("2021-02-28T00:00:00Z"),"expectedDeliveryDate" : ISODate("2021-03-03T00:00:00Z")
}
{"_id" : ObjectId("603dd4b2044b995ad331c0b4"),"custId" : 458,"purchaseDate" : ISODate("2021-02-26T00:00:00Z"),"expectedDeliveryDate" : ISODate("2021-03-01T00:00:00Z")
}

根据日期范围筛选

使用下面的代码更新上一个示例中的shipping集合,在文档中添加交货日期:

db.shipping.updateOne({ custId: 456 },{ $set: { deliveryDate: ISODate( "2021-01-10" ) } }
)db.shipping.updateOne({ custId: 457 },{ $set: { deliveryDate:  ISODate( "2021-03-01" ) } }
)db.shipping.updateOne({ custId: 458 },{ $set: { deliveryDate:  ISODate( "2021-03-02" ) } }
)

下面的聚合查找延迟发货的文档,在$match阶段使用$dateAdd创建一个过滤器,匹配起始点($purchaseDate)和 $dateAdd 给定的时间段所定义的日期范围内的文档:

db.shipping.aggregate([{$match:{$expr:{$gt:[ "$deliveryDate",{$dateAdd:{startDate: "$purchaseDate",unit: "day",amount: 5}}]}}},{$project:{_id: 0,custId: 1,purchased:{$dateToString:{format: "%Y-%m-%d",date: "$purchaseDate"}},delivery:{$dateToString:{format: "%Y-%m-%d",date: "$deliveryDate"}}}}]
)

$match阶段使用表达式($expr)中的$gt$dateAdd来比较实际交货日期和预期日期。交货日期比购买日期晚5天以上的文档会被转到$project阶段。

$project阶段使用$dateToString表达式将日期转换为更易读的格式。如果不进行转换,MongoDB将以ISODate格式返回日期。

本例中只返回一条记录:

{ "custId" : 456, "purchased" : "2020-12-31", "delivery" : "2021-01-10" }

调整夏令时

所有日期在内部都以UTC时间存储。如果指定了时区,$dateAdd将使用当地时间进行计算。计算结果以UTC显示。

本例假如客户分布在多个时区,按天或按小时计费,现在要了解夏令时对计费期的影响。

创建billing集合:

db.billing.insertMany([{location: "America/New_York",login: ISODate("2021-03-13T10:00:00-0500"),logout: ISODate("2021-03-14T18:00:00-0500")},{location: "America/Mexico_City",login: ISODate("2021-03-13T10:00:00-00:00"),logout: ISODate("2021-03-14T08:00:00-0500")}]
)

首先,在每个文档中的login日期上添加1天,然后添加24小时。

db.billing.aggregate([{$project:{_id: 0,location: 1,start:{$dateToString:{format: "%Y-%m-%d %H:%M",date: "$login"}},days:{$dateToString:{format: "%Y-%m-%d %H:%M",date:{$dateAdd:{startDate: "$login",unit: "day",amount: 1,timezone: "$location"}}}},hours:{$dateToString:{format: "%Y-%m-%d %H:%M",date:{$dateAdd:{startDate: "$login",unit: "hour",amount: 24,timezone: "$location"}}}},startTZInfo:{$dateToString:{format: "%Y-%m-%d %H:%M",date: "$login",timezone: "$location"}},daysTZInfo:{$dateToString:{format: "%Y-%m-%d %H:%M",date:{$dateAdd:{startDate: "$login",unit: "day",amount: 1,timezone: "$location"}},timezone: "$location"}},hoursTZInfo:{$dateToString:{format: "%Y-%m-%d %H:%M",date:{$dateAdd:{startDate: "$login",unit: "hour",amount: 24,timezone: "$location"}},timezone: "$location"}},}}]
).pretty()

$dateToString表达式对输出进行了重新格式化,以提高可读性。结果汇总如下:

字段纽约墨西哥城
start2021-03-13 15:002021-03-13 10:00
Start, TZ Info2021-03-13 10:002021-03-13 04:00
1 Day2021-03-14 14:002021-03-14 10:00
1 Day, TZ Info2021-03-14 10:002021-03-14 04:00
24 Hours2021-03-14 15:002021-03-14 10:00
24 Hours, TZ Info2021-03-14 11:002021-03-14 04:00

上表强调了几点:

  • 未格式化的日期以 UTC 返回。纽约的$login是 UTC -5,但开始、天数和小时行显示的时间是 UTC 时间。

  • 3月14日是纽约的夏令时开始日,但不是墨西哥的夏令时开始日。当某地切换到DST并从某一天跨入下一天时,计算的时间会进行调整。

  • 夏令时改变的是一天的长度,而不是小时。夏令时不会改变小时数。只有当测量单位为日或更大且计算跨越指定时区的时钟变化时,才会对 DST 进行调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wails+elementplus 打造GUI程序

商品系统 git地址&#xff1a;https://github.com/daimao0/goods-system 技术栈 本系统使用 wails vue3 elementplus gorm 数据库使用 sqlite 本地系统没有上云和账户能力&#xff0c;可以通过系统备份和导入来同步数据库如何使用 打包&#xff1a;wails build --platf…

代码随想录算法训练营day29

题目&#xff1a;491.递增子序列、46.全排列、47.全排列 II 参考链接&#xff1a;代码随想录 491.递增子序列 思路&#xff1a;一开始按照基本回溯的模板来写。当路径长度大于2时加入ans&#xff0c;结束条件为开始位置到达末尾。for循环部分遍历第一个加入path中的数&#…

计讯物联智慧工业园区系统平台全面提升园区智能化水平

工业园区聚集着各种生产要素&#xff0c;是纺织、机械、家具等诸多产业集中的区域&#xff0c;更是资源消耗和污染物排放的集中地。根据某些工业园区环境调研&#xff0c;园区入驻企业从生产原料到生产制造过程大多带有有毒有害、易燃易爆的特性&#xff0c;再加上装置大型化、…

SpringBoot 热部署。

SpringBoot 热部署。 文章目录 SpringBoot 热部署。 pom.xml。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional…

LeetCode-第137题-只出现一次的数||

1.题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 2.样例描述 3.思路描述 先把数组排序&am…

M2TS转MP4怎么转?超快的方法~

M2TS格式的优点主要体现在对高清视频的完美支持&#xff0c;能够提供极致的视觉体验。然而&#xff0c;由于其相对较大的文件大小&#xff0c;有时可能不太适合网络传输。此外&#xff0c;部分不支持M2TS的播放设备可能导致一定的兼容性问题。 想要播放m2ts视频&#xff0c;可…

【kubernetes】关于k8s集群如何将pod调度到指定node节点?

目录 一、k8s的watch机制 二、scheduler的调度策略 Predicate&#xff08;预选策略&#xff09; 常见算法&#xff1a; priorities&#xff08;优选策略&#xff09;常见的算法有&#xff1a; 三、k8s的标签管理之增删改查 四、k8s的将pod调度到指定node的方法 方案一&am…

DFS回溯-经典全排列问题(力扣)

前言 对于全排列问题&#xff0c;常用的做法是设置一个vis数组来确定位置i上的数字是否被访问&#xff0c;因为是全排列问题&#xff0c;所以不同的顺序也是不一样的排列&#xff0c;因此每次都是从起点开始询问**(注意起点到底是0还是1)** 46全排列(最简单的模板) class So…

Object.assign 这算是深拷贝吗

在JavaScript中&#xff0c;Object.assign() 是一个用于合并对象属性的常见方法。然而&#xff0c;对于许多开发者来说&#xff0c;关于它是否执行深拷贝的认识可能存在一些混淆。先说答案Object.assign() 不属于深拷贝&#xff0c;我们接着往下看。 Object.assign() 概览 首…

某资产管理系统打点过程中的免杀经历

上周&#xff0c;被扔过来单位内部的一个链接&#xff0c;让渗透一下&#xff0c;本以为三下五除二很快就能测完&#xff0c;没想到在对抗杀软时费了一番功夫&#xff0c;再加上杂七杂八的事儿&#xff0c;经过了一个星期才测完(&#xff03;&#xffe3;&#xff5e;&#xff…

贪心 Leetcode 45 跳跃游戏II

跳跃游戏II Leetcode 45 学习记录自代码随想录 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < …

C#知识点-21(初识数据库)

数据库与内存、文件的比较 内存&#xff1a; 优点&#xff1a;存取速度快 缺点&#xff1a;-容量小 -断电后&#xff0c;数据不会保存 文件&#xff1a; 优点&#xff1a;数据可以持久化保存 缺点&#xff1a;-读取速度慢…

mprpc分布式RPC网络通信框架

mprpc 项目介绍 该项目是一个基于muduo、Protobuf和Zookeeper实现的轻量级分布式RPC网络通信框架。 可以把任何单体架构系统的本地方法调用&#xff0c;重构成基于TCP网络通信的RPC远程方法调用&#xff0c;实现同一台机器的不同进程之间的服务调用&#xff0c;或者不同机器…

下载无水印抖音视频

在抖音看到某些视频想下载&#xff0c;却出现无法保存在本地【显示"作品暂时无法保存,链接已复制"】。或者下载的视频有水印。 而某些微信小程序下载可能需要付费或者有水印。其实我们可以直接使用电脑浏览器直接下载。 举个例子: 这是来自王道官方账号的一条视频链…

基于springboot的某大学外卖系统的实现(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 1 后台登录 2管理员界面 3员工信息管理 4客户信息管理 三、库表设计 四、论文 前言 如今&#xff0c;信息化不断的高速发展&#xff0c;社会也跟着不断进步&#xff0c;现今的社会&#xff0c;各种工作都离不开信息化技…

Python基础二

一、变量 在编程中&#xff0c;变量是用来存储数据值的名称。在 Python 中&#xff0c;变量是动态类型的&#xff0c;这意味着你可以将任何类型的数据分配给一个变量&#xff0c;而不需要提前声明变量的类型。 1、全局变量 在函数外部定义的变量是全局变量&#xff0c;可以在程…

boost 编译

参考博客&#xff1a;vs2019 boost 入坑指南 boost下载 官方网站&#xff1a;https://www.boost.org/ 下面以boost_1_73_0为例&#xff1a; boost编译 解压boost_1_73_0.zip运行bootstrap.bat&#xff08;此时目录下会生成b2.exe&#xff09;编译boost b2 install --build…

【vue2项目总结】——动态渲染

文章目录 主页渲染封装接口页面调用传到子组件 搜索列表渲染根据关键字搜索分类id搜索 主页渲染 封装接口 封装准备接口 api/home.js import request from /utils/request// 获取首页数据 export const getHomeData () > {return request.get(/page/detail, {params: {p…

springboot3.x集成SpringDoc Swagger3

近期将springboox2.x升级到了3.x&#xff0c;索性将swagger2也同步升级到swagger3&#xff0c;具体过程如下。 一、添加maven依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>…

详解Java中的注解

在Java中&#xff0c;注解(Annotation)引入始于Java5&#xff0c;用来描述Java代码的元信息&#xff0c;通常情况下注解不会直接影响代码的执行&#xff0c;尽管有些注解可以用来做到影响代码执行。 注解可以做什么 Java中的注解通常扮演以下角色 编译器指令构建时指令运行时…