$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.00Z2010-01-01T00:00:00.00Z2020-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字段截断为2binSizeweekunit时间周期,在America/Los_Angelestimezone中,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 } ]