MongoDB聚合运算符:$dateTrunc

聚合运算符$dateTrunc用于将日期字段的时间部分截断到指定的单位。

$dateTrunc 可以用于以下场景:

  • 按指定的时间单位对日期进行截断:这意味着可以将日期字段舍入到最近的单位,如天、小时、分钟等。例如,将所有记录舍入到最近的小时。
  • 在聚合查询中按截断后的日期进行分组:当结合$group操作符使用时, d a t e T r u n c 可以帮助你按照截断后的日期进行分组,这对于生成时间序列数据的报告非常有用。例如,要统计每个月的销售总额,可以先使用 dateTrunc 可以帮助你按照截断后的日期进行分组,这对于生成时间序列数据的报告非常有用。例如,要统计每个月的销售总额,可以先使用 dateTrunc可以帮助你按照截断后的日期进行分组,这对于生成时间序列数据的报告非常有用。例如,要统计每个月的销售总额,可以先使用dateTrunc 将销售日期截断到月份,然后再使用$group进行分组和求和。
  • 精确控制日期字段的显示和比较:通过截断日期,可以确保在进行比较或排序时,只考虑日期的特定部分,从而得到更精确的结果。
  • 处理时间序列数据:在处理时间序列数据时,$dateTrunc可以用来更好地分析和汇总数据,比如计算特定时间段内的平均销售额或用户活跃度等。

语法

{$dateTrunc: {date: <Expression>,unit: <Expression>,binSize: <Expression>,timezone: <tzExpression>,startOfWeek: <Expression>}
}

字段说明

字段是否必须描述
date要截断的日期(UTC),可以是日期、时间戳或对象Id表达式
unit要增加的时间的单位,单位可以是能被解析为下列值的表达式:yearquarterweekmonthdayhourminutesecondmillisecond,与binSize一起指定时间段
binSize时间数值,以表达式形式指定,必须是非零正数。默认值为 1。
timezone执行操作的时区,<tzExpression>必须是能被解析为奥尔森时区标识符格式的字符串或UTC偏移量,如果timezone不指定,返回值显示为UTC
startOfWeek指定周开始的天,只有当单位是周时可用,缺省为SundaystartOfWeek可以是一个表达式,但必须能够被解析为:monday (或 mon)tuesday (或 tue)wednesday (或 wed)thursday (或 thu)friday (或 fri)saturday (或 sat)sunday (或 sun)

使用

  • startOfWeek字段外的其他字段如果缺失或为空,亦或者unitweek并且startOfWeek缺失或为null,直接返回null
  • 对于1583年之前的日期使用预推公历。
  • 计算夏令时,不计算闰秒。

binSize和unit字段

  • binSizeunit一起用于指定$dateTrunc计算的时间段,例如:

    • binSize1unithour,则时间段为1小时,对于日期2021-03-20T11:30:05Z$dateTrunc返回2021-03-20T11:00:00Z
    • binSize2unithour,则时间段为2小时,对于日期2021-03-20T11:30:05Z$dateTrunc返回2021-03-20T10:00:00Z
  • $dateTrunc截取以unit为单位,binSize个时间段,时段开始于基准日期,并且由unit决定:

    • 如果unit是除week外的其他值,$dataTrunc使用参考日期,拿2000-01-01T00:00:00.00Z,例来说,如果binSize为10,并且单位unit为年,示例的时间段为:
      • 2000-01-01T00:00:00.00Z
      • 2010-01-01T00:00:00.00Z
      • 2020-01-01T00:00:00.00Z
    • 如果unit的值是week,则$dateTrunc使用一周中的首日作为基准日期,可能会大于等于2000-01-01,首日由startOfWeek指定。
  • $dateTrunc以ISODate格式返回日期时段的下边界,如果binSize的值为1,$dateTruncunit指定单位后面的值设置为0,其余部分保持不变。

  • 当unit为:

    • year,以date所在年度1月1日为基准
    • quarter,以date所属季度的第一天为基准
    • month,以date所属月份的第一天为基准
    • week,以date所在周中startOfWeek指定的那一天为基准,缺省为Sunday
    • day,以date为基准
    • hour,以date的小时为基准
    • minute,以date的分钟为基准
    • second,以date的秒为基准

unit和startOfWeek字段

  • 如果unit的值不等于weekstartOfWeek将被忽略
  • 如果unit的值等于week,当指定startOfWeek时,使用startOfWeek指定值作为周的第一天。否则,使用Sunday

举例

创建一个包含加利福尼亚州(CA)和华盛顿州(WA)蛋糕销售记录的集合cakeSales

db.cakeSales.insertMany( [{ _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),state: "CA", price: 13, quantity: 120 },{ _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),state: "WA", price: 14, quantity: 140 },{ _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),state: "CA", price: 12, quantity: 145 },{ _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),state: "WA", price: 13, quantity: 104 },{ _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),state: "CA", price: 41, quantity: 162 },{ _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),state: "WA", price: 43, quantity: 134 }
] )

$project管道阶段截取订单日期

db.cakeSales.aggregate( [{$project: {_id: 1,orderDate: 1,truncatedOrderDate: {$dateTrunc: {date: "$orderDate", unit: "week", binSize: 2,timezone: "America/Los_Angeles", startOfWeek: "Monday"}}}}
] )

本例中:

  • $project将文档的_idorderDatetruncatedOrderDate字段输出到下一阶段
  • $dateTrunc使用binSize为2,unitweek,时区为America/Los_AngelesstartOfWeekMondayorderDate字段进行截取

结果如下:

[{_id: 0,orderDate: ISODate("2020-05-18T14:10:30.000Z"),truncatedOrderDate: ISODate("2020-05-11T07:00:00.000Z")},{_id: 1,orderDate: ISODate("2021-03-20T11:30:05.000Z"),truncatedOrderDate: ISODate("2021-03-15T07:00:00.000Z")},{_id: 2,orderDate: ISODate("2021-01-11T06:31:15.000Z"),truncatedOrderDate: ISODate("2021-01-04T08:00:00.000Z")},{_id: 3,orderDate: ISODate("2020-02-08T13:13:23.000Z"),truncatedOrderDate: ISODate("2020-02-03T08:00:00.000Z")},{_id: 4,orderDate: ISODate("2019-05-18T16:09:01.000Z"),truncatedOrderDate: ISODate("2019-05-13T07:00:00.000Z")},{_id: 5,orderDate: ISODate("2019-01-08T06:12:03.000Z"),truncatedOrderDate: ISODate("2019-01-07T08:00:00.000Z")}
]

在$group阶段对分组日期字段进行截取

下面的例子在$group阶段使用dateTrunc对蛋糕销售记录的orderDate值,按照6个月进行截断,然后进行分组汇总:

db.cakeSales.aggregate( [{$group: {_id: {truncatedOrderDate: {$dateTrunc: {date: "$orderDate", unit: "month", binSize: 6}}},sumQuantity: { $sum: "$quantity" }}}
] )

在本例中:

  • $grouptruncatedOrderDate作为_id字段对cakeSales文档进行分组,使用$sum对分组内的quantity字段值进行合计
  • $dateTrunc以6个月的间隔对orderDate进行截取

结果如下:

[{_id: { truncatedOrderDate: ISODate("2020-01-01T00:00:00.000Z") },sumQuantity: 224},{_id: { truncatedOrderDate: ISODate("2021-01-01T00:00:00.000Z") },sumQuantity: 285},{_id: { truncatedOrderDate: ISODate("2019-01-01T00:00:00.000Z") },sumQuantity: 296}
]

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

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

相关文章

xtrabackup-docker实战

xtrabackup 引言 案例代码可以从https://github.com/WeiXiao-Hyy/k8s_example获取&#xff0c;欢迎Star&#xff01; 环境准备 创建数据文件夹和备份文件夹 mkdir -p ~/GitCode/xtrabackup/mysql/data mkdir -p ~/GitCode/xtrabackup/mysql/backup制作MySQL:5.7运行环境 …

Spring事务注解@Transactional的流程和源码分析

Spring事务简介 Spring事务有两种方式&#xff1a; 编程式事务&#xff1a;编程式事务通常使用编程式事务管理API实现&#xff0c;比如Spring提供的PlatformTransactionManager接口&#xff0c;使用它操控事务。声明式事务&#xff1a;注解式事务使用AOP&#xff08;面向切面…

字符串匹配问题(strs)

作者 刘昆 单位 中国矿业大学徐海学院 字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式&#xff0c;从内到外必须是<>,(),[],{}&#xff0c;例如。输入: [()] 输出 YES&#xff0c;而输入([])&#xff0c;([)]都应该输…

通过Dockerfile创建镜像

通过Dockerfile创建镜像 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 1. 常用选项说明--build-arg&#xff0c;设置…

Java学习笔记------内部类

类的五大成员 属性、方法、构造方法、代码块、内部类 内部类 格式&#xff1a; public class Outer{//外部类 public class Inner{//内部类 } } public class Test{//外部其他类 public static void main(String[] args) } inner类表示的事物是Outer类的一部分&#xf…

Python时间模块

Python语言的time模块&#xff1a;提供获取操作系统时间的相关命令 时间的表示方法 时间戳 从1970.1.1 0.0.0到当前时间点经历的秒数UTC &#xff08;世界协调时间&#xff09; 以英国格林威治这个城市所在的经度点为0时时区&#xff0c;向东或者向西每15度为1个时区&#xf…

数据库设计的三大范式理解与应用

数据库设计的三大范式是关系型数据库设计的基本原则&#xff0c;它们分别是&#xff1a;第一范式&#xff08;1NF&#xff09;&#xff1a;确保数据库表的每一列都是不可分割的基本数据项&#xff0c;即表中的所有字段值都是不可再分的原子值。这个范式的主要目的是确保每一个字…

【计算机考研】考408,还是不考408性价比高?

首先综合考虑&#xff0c;如果其他科目并不是很优秀&#xff0c;需要我们花一定的时间去复习&#xff0c;408的性价比就不高&#xff0c;各个科目的时间互相挤压&#xff0c;如果备考时间不充裕&#xff0c;考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…

公司项目总结合分享经验

珠海督办 1.批量导入 导入excel表单给接口&#xff0c;接口返回前端想要的数据 list是代表数据的数量&#xff0c;titleMap是代表数据中会有那些字段 listl里面的字段&#xff1a; value是代表要显示的值&#xff0c;success为true代表excel表格的内容填写是正确的&#…

前端布局方式及其优缺点

前端布局方式多种多样&#xff0c;每种布局方式都有其特定的应用场景、特性和优缺点。以下是一些常见的前端布局方式及其特点和优缺点&#xff1a; 静态布局&#xff1a; 特性&#xff1a;元素的尺寸使用绝对单位&#xff08;如px&#xff09;进行定义&#xff0c;不会随浏览器…

代码随想录训练营第三十期|第五十三天|动态规划part14|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp new int[text1.length() 1][text2.length() 1];dp[0][0] 0;for (int i 1; i < text1.length(); i) {ch…

1.5 简述转置卷积的主要思想以及应用场景

1.5 简述转置卷积的主要思想以及应用场景 普通的卷积主要思想&#xff1a; 普通的卷积操作可以形式化为一个矩阵乘法运算&#xff0c;即yAx&#xff08;1-12&#xff09; 其中&#xff0c;x和y分别是卷积的输入和输出(展平成一维向量形式)&#xff0c;维度分别为d⁽i⁾和d⁽…

Linux:kubernetes(k8s)探针ReadinessProbe的使用(9)

本章yaml文件是根据之前文章迭代修改过来的 先将之前的pod删除&#xff0c;然后使用下面这个yaml进行生成pod apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标…

第三百八十八回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形边框&#x…

Vue+SpringBoot打造超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

区块链基础知识01

区块链&#xff1a;区块链技术是一种高级数据库机制&#xff0c;允许在企业网络中透明地共享信息。区块链数据库将数据存储在区块中&#xff0c;而数据库则一起链接到一个链条中。数据在时间上是一致的&#xff0c;在没有网络共识的情况下&#xff0c;不能删除或修改链条。 即&…

mysql表数据更新

文章目录 插入数据插入单条数据插入多条数据复制表插入数据 更新数据删除数据截断表 数据库和表创建完成后&#xff0c;应该如何使用呢&#xff1f; 插入数据 插入单条数据 INSERT INTO table_name (column_name1, column_name2, ...) VALUE (value1, value2, ...);插入多条数…

2、函数、对象、对象方法函数的使用、扩展运算符、箭头函数

一、函数 1、数字类型的用法 带Number的先判断是不是数字类型 Number.isNaN() 判断是否 是非数值 非数值返回 true数值类型返回 false console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN(false)); // false console.log(Number.isNaN(null)); // false c…

【uni-app小程序开发】实现一个背景色渐变的滑动条slider

最近做的一个用uni-app+vue2开发的微信小程序项目中要实现一个滑动进度控制条,如下图所示: 1. 滑动条需要渐变背景色 2. 滑块的背景色需要与当前位置滑动条的背景色一致(动态改变) 碰到这样的需求,我当然先是看看官方提供的slider组件和uView里的u-slider组件能不能满足…