$dateTrunc(聚合)
定义
版本 5.0 中的新增功能。
截断日期。
$dateTrunc
事务语法:
{ $dateTrunc: { date: <Expression>, unit: <Expression>, binSize: <Expression>, timezone: <tzExpression>, startOfWeek: <Expression> } }
字段 | 必需/可选 | 说明 | ||||||
---|---|---|---|---|---|---|---|---|
必需 | 要截断的日期,以 UTC 格式指定。日期可以是解析为 Date 、 Timestamp 或 ObjectID 的任何表达式。 | |||||||
必需 | 时间单位,指定为必须解析为以下字符串之一的表达式:
binSize 和unit 一起指定 | |||||||
Optional | 数值时间值,指定为必须解析为非零正数的表达式。默认为 1。 binSize 和unit 一起指定 | |||||||
Optional | 用于 如果未提供时区,则按 UTC 执行
| |||||||
Optional | 一周的开始。 当单位为 startOfWeek 是一个必须解析为以下不区分大小写的字符串之一的表达式:
|
行为
如果出现以下情况,则返回
null
:除 startOfWeek 之外的任何输入字段均缺失或设置为
null
,或者如果单位为
week
且 startOfWeek 缺失或设置为null
。
使用外推格里历表示 1583 年以前的日期。
会考虑夏令时,但不会考虑闰秒。
binSize
和 字段unit
binSize 和单位共同指定了 $dateTrunc
计算中使用的时间段。
例如:
如果 binSize 为
1
且 unit 为hour
,则时间段为一小时。对于日期2021-03-20T11:30:05Z
,$dateTrunc
返回2021-03-20T11:00:00Z
。如果 binSize 为
2
且 单位 为hour
,则时间段为两小时。对于日期2021-03-20T11:30:05Z
,$dateTrunc
返回2021-03-20T10:00:00Z
。
将
$dateTrunc
计算的时间按照指定的时间单位分成 binSize 时间段。除
week
以外的字符串,$dateTrunc
将2000-01-01T00:00:00.00Z
作为参考日期。例如,如果 binSize 为10
且单位为year
,则示例时间段为:2000-01-01T00:00:00.00Z
2010-01-01T00:00:00.00Z
2020-01-01T00:00:00.00Z
等于
week
,$dateTrunc
使用了一个参考日期,这个日期被设置为当前周的第一天,且不早于2000-01-01
。使用 startOfWeek 设置第一天(默认为周日)。
返回日期所在时间段的下边界。该边界将以 ISODate 的形式返回。如果 binSize 字段为
1
,则$dateTrunc
会将返回的 ISODate 的最低有效部分(由单位确定)设置为0
,并保持 ISODate 的其余部分不变。
如果 unit 为:
year
:$dateTrunc
在日期中返回当年1 1 月开始的ISODate 。quarter
:$dateTrunc
返回日期中的日历季度第一天开始的 ISODate。季度是:
1 月至 3 月
4 月至 6 月
7 月至 9 月
10 月至 12 月
month
:$dateTrunc
在日期中返回当月第一天开始的 iso Date。week
:$dateTrunc
返回日期中的 startOfWeek 日期开始的 ISODate。startOfWeek 的默认值是星期日。day
:$dateTrunc
返回给定日期的当天开始时刻的 ISODate。hour
:$dateTrunc
返回指定日期所在小时开始时的 ISODate。minute
:$dateTrunc
返回指定日期所在分钟开始时的 ISODate。second
:$dateTrunc
返回 date 中的秒开始时的 ISODate。
unit
和 字段startOfWeek
如果 unit 为:
除
week
之外的字符串,sartOfWeek 将被忽略。等于
week
且 startOfWeek:指定:
$dateTrunc
使用 startOfWeek 作为一周的第一天进行计算。省略:
$dateTrunc
使用星期日作为一周的开始进行计算。
示例
创建cakeSales
集合,其中包含加利福尼亚州 ( CA
) 和华盛顿州 ( WA
) 的蛋糕销售情况:
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 } ] )
以下示例中使用了 cakeSales
集合。
截断$project
管道阶段中的订单日期
此示例在 $project
阶段中使用 $dateTrunc
将蛋糕销售 orderDate
值截断为两周:
db.cakeSales.aggregate( [ { $project: { _id: 1, orderDate: 1, truncatedOrderDate: { $dateTrunc: { date: "$orderDate", unit: "week", binSize: 2, timezone: "America/Los_Angeles", startOfWeek: "Monday" } } } } ] )
在示例中:
$project
在输出中包含_id
、orderDate
和truncatedOrderDate
字段。$dateTrunc
会将orderDate
字段截断成2
binSize 以week
为单位的时间段,时区为America/Los_Angeles
,startOfWeek 设置为Monday
。
在此示例输出中,截断的 orderDate
显示在 truncatedOrderDate
字段中:
[ { _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 个月,并返回 quantity
值的总和:
db.cakeSales.aggregate( [ { $group: { _id: { truncatedOrderDate: { $dateTrunc: { date: "$orderDate", unit: "month", binSize: 6 } } }, sumQuantity: { $sum: "$quantity" } } } ] )
在示例中:
$group
将_id
字段设为truncatedOrderDate
字段,以对cakeSales
文档进行份组,并使用$sum
返回每个群组的quantity
值的总和。
在此示例输出中,截断的 orderDate
显示在 truncatedOrderDate
字段中,quantity
的总和显示在 sumQuantity
字段中:
[ { _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 } ]