Definition定义
$dateTrunc
New in version 5.0.在版本5.0中新增。
Truncates a date.截断日期。
$dateTrunc syntax:语法:
{
$dateTrunc: {
date: <Expression>,
unit: <Expression>,
binSize: <Expression>,
timezone: <tzExpression>,
startOfWeek: <Expression>
}
}
date |
| |||||||
unit |
| |||||||
binSize |
| |||||||
timezone |
| |||||||
startOfWeek |
|
Behavior行为
Returns如果满足以下条件,则返回nullif:null:any of the input fields except startOfWeek is missing or set to除null, orstartOfWeek之外的任何输入字段缺失或设置为null,或if unit is如果weekand startOfWeek is missing or set tonull.unit是week,而startOfWeek缺失或设置为null。
Uses the proleptic Gregorian calendar for dates preceding the year 1583.1583年之前的日期使用保守的公历。Accounts for Daylight Savings Time, but does not account for leap seconds.考虑夏令时,但不考虑闰秒。
binSize and 和unit Fields字段
Together, binSize and unit specify the time period used in the $dateTrunc calculation.binSize和unit一起指定$dateTrunc计算中使用的时间段。
For example:例如:
If binSize is如果1and unit ishour, the time period is one hour. For the date2021-03-20T11:30:05Z,$dateTruncreturns2021-03-20T11:00:00Z.binSize为1,unit为hour,则时间段为一小时。对于date2021-03-20T11:30:05Z,$dateTrunc返回2021-03-20T11:00:00Z。If binSize is如果2and unit ishour, the time period is two hours. For the date2021-03-20T11:30:05Z,$dateTruncreturns2021-03-20T10:00:00Z.binSize为2,unit为hour,则时间段为两小时。对于date2021-03-20T11:30:05Z,$dateTrunc返回2021-03-20T10:00:00Z。
Divides the time for the将$dateTrunccalculation into binSize time periods in the specified time unit.$dateTrunc计算的时间划分为指定时间unit的binSize时间段。The time periods start at a reference date, which is determined by unit. If unit is:时间段从参考日期开始,参考日期由unit确定。如果unit为:A string other than除week,$dateTruncuses a reference date of2000-01-01T00:00:00.00Z. For example, if binSize is10and unit isyear, example time periods are: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
Equal to等于week,$dateTruncuses a reference date that is set to the earliest first day of the week that is greater than or equal to2000-01-01. The first day is set using startOfWeek (the default is Sunday).week,$dateTrunc使用的参考日期设置为大于或等于2000-01-01的一周中最早的第一天。使用startOfWeek设置第一天(默认值为星期日)。
Returns the lower boundary of the time period that the date is in. The boundary is returned as an ISODate.返回date所在时间段的下限。该边界以ISODate形式返回。If the binSize field is如果1,$dateTruncsets the least significant parts (as determined by unit) of the returned ISODate to0and keeps the rest of the ISODate the same.binSize字段为1,$dateTrunc会将返回的ISODate的最低有效部分(由unit确定)设置为0,并保持ISODate的其余部分不变。
If unit is:如果unit为:
year::$dateTruncreturns the ISODate for the start of January 1 for the year in date.$dateTrunc返回date中年份从1月1日开始的ISODate。quarter::$dateTruncreturns the ISODate for the start of the first day of the calendar quarter in date.$dateTrunc返回date中日历季度第一天开始的ISODate。The quarters are:季度是:January to March1月至3月April to June4月至6月July to September7月到9月October to December10月至12月
month::$dateTruncreturns the ISODate for the start of the first day of the month in date.$dateTrunc返回date中月份第一天开始的ISODate。week::$dateTruncreturns the ISODate for the start of the startOfWeek day in date. The default for startOfWeek is Sunday.$dateTrunc返回date中startOfWeek日开始的ISODate。startOfWeek的默认值是星期日。day::$dateTruncreturns the ISODate for the start of the day in date.$dateTrunc返回date中当天开始的ISODate。hour::$dateTruncreturns the ISODate for the start of the hour in date.$dateTrunc返回date中小时开始的ISODate。minute::$dateTruncreturns the ISODate for the start of the minute in date.$dateTrunc返回date中分钟开始的ISODate。second::$dateTruncreturns the ISODate for start of the second in date.$dateTrunc返回date中第二个开始的ISODate。
unit and 和startOfWeek Fields字段
A string other than除week, startOfWeek is ignored.week之外的字符串,startOfWeek将被忽略。Equal to等于weekand startOfWeek is:week,startOfWeek为:Specified:指定:$dateTruncuses startOfWeek as the first day of the week for the calculation.$dateTrunc使用startOfWeek作为一周的第一天进行计算。Omitted:省略:$dateTruncuses Sunday as the start of the week for the calculation.$dateTrunc使用周日作为一周的开始进行计算。
Examples示例
Create a 创建一个cakeSales collection that contains cake sales in the states of California (CA) and Washington (WA):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 }
] )
The 以下示例中使用了cakeSales collection is used in the following examples.cakeSales集合。
Truncate Order Dates in a $project Pipeline Stage截断$project管道阶段的订单日期
$project Pipeline StageThis example uses 此示例在$dateTrunc in a $project stage to truncate the cake sales orderDate values to two weeks:$project阶段使用$dateTrunc将蛋糕销售订单日期值截断为两周:
db.cakeSales.aggregate( [
{
$project: {
_id: 1,
orderDate: 1,
truncatedOrderDate: {
$dateTrunc: {
date: "$orderDate", unit: "week", binSize: 2,
timezone: "America/Los_Angeles", startOfWeek: "Monday"
}
}
}
}
] )
In the example:在示例中:
$projectincludes the输出中包括_id,orderDate, andtruncatedOrderDatefields in the output._id、orderDate和truncatedOrderDate字段。$dateTrunctruncates theorderDatefield to a2binSizeweekunit time period in theAmerica/Los_Angelestimezone with startOfWeek set toMonday.$dateTrunc将orderDate字段截断为America/Los_Angeles时区中的2binSize周单位时间段,startOfWeek设置为Monday。
In this example output, the truncated 在此示例输出中,截断的orderDate is shown in the truncatedOrderDate field:orderDate显示在截断的orderDate字段中:
[
{
_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")
}
]Truncate Order Dates and Obtain Quantity Sum in a $group Pipeline Stage截断订单日期并获取$group管道阶段的数量总和
$group Pipeline StageThis example uses 此示例在$dateTrunc in a $group stage to truncate the cake sales orderDate values to six months and return the sum of the quantity values:$group阶段中使用$dateTrunc将蛋糕销售orderDate值截断为六个月,并返回数量值的总和:
db.cakeSales.aggregate( [
{
$group: {
_id: {
truncatedOrderDate: {
$dateTrunc: {
date: "$orderDate", unit: "month", binSize: 6
}
}
},
sumQuantity: { $sum: "$quantity" }
}
}
] )
In the example:在示例中:
$grouphas the_idfield set to thetruncatedOrderDatefield to group thecakeSalesdocuments, and returns the sum of thequantityvalues for each group using$sum.$group将_id字段设置为truncatedOrderDate字段,以对cakeSales文档进行分组,并使用$sum返回每个组的quantity值之和。$dateTrunctruncates the将orderDatefield to a6binSizemonthunit time period.orderDate字段截断为6binSize月单位时间段。
In this example output, the truncated 在此示例输出中,截断的orderDate is shown in the truncatedOrderDate field and the quantity sum is shown in the sumQuantity field: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
}
]