$dateTrunc(聚合)
定义
新在版本5.0.
截断日期。
$dateTrunc
语法
{ $dateTrunc: { date: <Expression>, unit: <Expression>, binSize: <Expression>, timezone: <tzExpression>, startOfWeek: <Expression> } }
字段 | 必需 / 可选 | 描述 | ||||||
---|---|---|---|---|---|---|---|---|
必需 | ||||||||
必需 | ||||||||
可选 | 数值时间值,指定为必须解析为正非零数字的表达式。默认为1。 一起,binSize 和 unit 指定了 | |||||||
可选 | 对于 如果没有提供任何 时间区域,则
| |||||||
可选 | 一周的开始。当 单元 是 startOfWeek 是一个必须解析为以下不区分大小写字符串之一的表达式
|
行为
如果
除了 startOfWeek 之外的其他输入字段缺失或设置为
null
,或者如果 unit 是
week
且 startOfWeek 缺失或设置为null
,则返回null
。
使用回溯格里高利日历来处理1583年之前的日期。
考虑了夏令时,但不考虑闰秒
binSize
和unit
字段
一起,binSize 和 unit 指定了 $dateTrunc
计算中使用的时间段。
例如
如果binSize是
1
并且unit是hour
,时间段是一小时。对于日期2021-03-20T11:30:05Z
,$dateTrunc
返回2021-03-20T11:00:00Z
。如果 binSize 为
2
并且 unit 为hour
,则时间段为两小时。对于日期2021-03-20T11:30:05Z
,$dateTrunc
返回2021-03-20T10:00:00Z
。
将
$dateTrunc
计算的时间划分为指定时间 unit 的 binSize 时间段。时间段从参考日期开始,参考日期由 unit 决定。
如果不是
week
的字符串,$dateTrunc
使用参考日期2000-01-01T00:00:00.00Z
。例如,如果 binSize 为10
并且 unit 为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(默认为星期日)设置。
返回 date 所在的时间段的下限。边界以 ISODate 返回。如果 binSize 字段为
1
,$dateTrunc
将返回的 ISODate 的最低有效部分(由 unit 确定)设置为0
,并保持其余部分不变。
如果 unit 是
year
:$dateTrunc
返回 date 中年份的 1 月 1 日的 ISODate。quarter
:$dateTrunc
返回 date 中日历季度的第一天 ISODate。季度如下:
一月到三月
四月到六月
七月到九月
十月到十二月
月份
:函数$dateTrunc
返回 ISODate,表示 date 中一个月的第一天的开始。周
:函数$dateTrunc
返回 ISODate,表示 date 中周起始日的开始。默认情况下,startOfWeek 为星期日。天
:函数$dateTrunc
返回 ISODate,表示 date 中一天的开始。小时
:函数$dateTrunc
返回 ISODate,表示 date 中一小时的开始。分钟
:函数$dateTrunc
返回 ISODate,表示 date 中一分钟的开始。秒
:函数$dateTrunc
返回 ISODate,表示 date 中一秒的开始。
unit
和 startOfWeek
字段
如果 unit 是
除了
周
和 startOfWeek 之外的其他字符串将被忽略。与
周
和 startOfWeek 相同的是:指定:函数
$dateTrunc
使用 startOfWeek 作为计算中的每周的第一天。省略:函数
$dateTrunc
使用星期日作为计算中的每周的第一天。
示例
创建一个包含加利福尼亚州(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 } ] )
cakeSales
集合在以下示例中使用。
在$project
管道阶段截断订单日期
此示例使用$dateTrunc
在一个$project
阶段截断蛋糕销售的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
binSizeweek
unit时间周期,在America/Los_Angeles
timezone中,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
流程阶段截断订单日期并获取数量总和
此示例使用 $dateTrunc
在 $group
阶段,以截断糕点销售 orderDate
值到六个月,并返回 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 } ]