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
   }
]

相关推荐

  1. MongoDB聚合运算符:$dateTrunc

    2024-03-12 23:40:04       45 阅读
  2. MongoDB聚合运算符:$add

    2024-03-12 23:40:04       55 阅读
  3. MongoDB聚合运算符:$arrayToObject

    2024-03-12 23:40:04       52 阅读
  4. MongoDB聚合运算符;$dateToParts

    2024-03-12 23:40:04       52 阅读
  5. MongoDB聚合运算符:$dayOfWeek

    2024-03-12 23:40:04       53 阅读
  6. MongoDB聚合运算符:$dayOfMonth

    2024-03-12 23:40:04       51 阅读
  7. MongoDB聚合运算符;$dateToString

    2024-03-12 23:40:04       48 阅读
  8. MongoDB聚合运算符:$dayOfYear

    2024-03-12 23:40:04       48 阅读
  9. MongoDB聚合运算符:$denseRank

    2024-03-12 23:40:04       42 阅读
  10. MongoDB聚合运算符:$divide

    2024-03-12 23:40:04       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-12 23:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-12 23:40:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-12 23:40:04       82 阅读
  4. Python语言-面向对象

    2024-03-12 23:40:04       91 阅读

热门阅读

  1. CMS垃圾收集

    2024-03-12 23:40:04       47 阅读
  2. python入门(一)

    2024-03-12 23:40:04       38 阅读
  3. IOS面试题object-c 21-30

    2024-03-12 23:40:04       45 阅读
  4. R语言中ggplot2图例位置、颜色、背景、标题

    2024-03-12 23:40:04       45 阅读
  5. [Python]`threading.local`创建线程本地数据

    2024-03-12 23:40:04       43 阅读
  6. 前端点击切换样式/切换主题

    2024-03-12 23:40:04       42 阅读
  7. 排列数字(DFS)

    2024-03-12 23:40:04       40 阅读
  8. 大数据入门之hadoop学习

    2024-03-12 23:40:04       43 阅读
  9. Spring神器:Environment环境配置

    2024-03-12 23:40:04       42 阅读
  10. LLM(大语言模型)常用评测指标之F1-Score

    2024-03-12 23:40:04       35 阅读
  11. 蓝桥杯:跑步锻炼

    2024-03-12 23:40:04       41 阅读
  12. Python基础学习(11)常用模块

    2024-03-12 23:40:04       41 阅读
  13. Spring事务管理

    2024-03-12 23:40:04       43 阅读
  14. ARM/Linux嵌入式面经(四):浙江大华

    2024-03-12 23:40:04       41 阅读