定义
版本 5.0 中的新增功能。
截断日期。
$dateTrunc 事务语法:
{ $dateTrunc: { date: <Expression>, unit: <Expression>, binSize: <Expression>, timezone: <tzExpression>, startOfWeek: <Expression> } }
字段 | 必需/可选 | 说明 |
|---|---|---|
必需 | 要截断的日期,以 UTC 格式指定。日期可以是解析为日期、时间戳或对象 ID 的任何表达式。 | |
必需 | 时间单位,指定为必须解析为以下字符串之一的表达式:
binSize 和unit 一起指定 | |
Optional | 数值时间值,指定为必须解析为非零正数的表达式。默认为 1。 binSize 和unit 一起指定 | |
Optional | 用于
如果未提供时区,则按 UTC 执行 | |
Optional | 一周的开始。当单位为 startOfWeek 是一个必须解析为以下不区分大小写的字符串之一的表达式:
|
行为
如果出现以下情况,则返回
null:除 startOfWeek 之外的任何输入字段均缺失或设立为
null,或者如果单位为
week且 startOfWeek 缺失或设立为null。
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计算的时间划分为指定时间单位的 binSize 时间段。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设立(默认为星期日)。
返回日期所在时间段的下边界。该边界以ISODate形式返回。如果 binSize字段为
1,则$dateTrunc将返回的ISODate的最低有效部分(由 单位确定)设置为0,并保持ISODate的其余部分不变。
year:$dateTrunc在 date 中返回当年 1 月 1 开始的ISODate 。week:$dateTrunc以日期形式返回 startOfWeek 日开始的ISODate 。 startOfWeek 的默认是星期日。
unit 和 字段startOfWeek
等于
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字段截断为America/Los_Angeles时区中2binSizeweek单位的时间段,并将 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 值截断为六个月,并返回 quantity 值的总和:
db.cakeSales.aggregate( [ { $group: { _id: { truncatedOrderDate: { $dateTrunc: { date: "$orderDate", unit: "month", binSize: 6 } } }, sumQuantity: { $sum: "$quantity" } } } ] )
在示例中:
$group将_id字段设为truncatedOrderDate字段,以对cakeSales文档进行份组,并使用$sum返回每个群组的quantity值的总和。$dateTrunc将orderDate字段截断为6binSizemonth单位时间段。
在此示例输出中,截断的 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 } ]