MongoDB聚合运算符:$dateAdd

2024-03-04 06:36

本文主要是介绍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表达式对输出进行了重新格式化,以提高可读性。结果汇总如下:

|字段|纽约|墨西哥城|
|-|-|
|start|2021-03-13 15:00|2021-03-13 10:00|
|Start, TZ Info|2021-03-13 10:00|2021-03-13 04:00|
|1 Day|2021-03-14 14:00|2021-03-14 10:00|
|1 Day, TZ Info|2021-03-14 10:00|2021-03-14 04:00|
|24 Hours|2021-03-14 15:00|2021-03-14 10:00|
|24 Hours, TZ Info|2021-03-14 11:00|2021-03-14 04:00|

上表强调了几点:

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

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

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

这篇关于MongoDB聚合运算符:$dateAdd的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772291

相关文章

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

【重学 MySQL】十九、位运算符的使用

【重学 MySQL】十九、位运算符的使用 示例检查权限添加权限移除权限 在 MySQL 中,位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用,比如权限管理、状态标记等。 &(位与) 对两个数的二进制表示进行位与操作。只有两个相应的二进制位都为 1 时,结果的该位才为 1,否则为 0。 |(位

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

生产mongodb 分片与集群 方案

链接:http://my.oschina.net/pwd/blog/411439#navbar-header 注:主要是有一键安装的脚本可以借鉴

mongodb基本命令和Java操作API示例

1.Mongo3.2 java API示例:http://www.cnblogs.com/zhangchaoyang/articles/5146508.html 2.MongoDB基本命:http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html 3.java MongoDB查询(一)简单查询: http://www.cnblogs

使用jetty和mongodb做个简易文件系统

使用jetty和mongodb做个简易文件系统 - ciaos 时间 2014-03-09 21:21:00   博客园-所有随笔区 原文   http://www.cnblogs.com/ciaos/p/3590662.html 主题  MongoDB  Jetty  文件系统 依赖库: 1,jetty(提供http方式接口) 2,mongodb的java驱动(访问mo