Definición
Nuevo en la versión 5.0.
Trunca una fecha.
$dateTrunc sintaxis:
{ $dateTrunc: { date: <Expression>, unit: <Expression>, binSize: <Expression>, timezone: <tzExpression>, startOfWeek: <Expression> } }
Campo | Requerido / Opcional | Descripción |
|---|---|---|
Requerido | La fecha a truncar, especificada en UTC. La fecha puede ser cualquier expresión que se resuelva en una fecha, una marca de tiempo o un identificador de objeto. | |
Requerido | La unidad de tiempo, especificada como una expresión que debe resolverse en una de estas cadenas:
En conjunto, binSize y unit especifican el período de tiempo utilizado en el cálculo | |
Opcional | El valor numérico de tiempo, especificado como una expresión que debe resolverse en un número positivo distinto de cero. Por defecto es 1. En conjunto, binSize y unit especifican el período de tiempo utilizado en el cálculo | |
Opcional | La zona horaria para el cálculo
Si no se proporciona ninguna zona horaria, el cálculo | |
Opcional | El comienzo de la semana. Se usa cuando la unidad es startOfWeek es una expresión que debe resolverse en una de estas cadenas que no distinguen entre mayúsculas y minúsculas:
|
Comportamiento
Retorna
nullsi:Cualquiera de los campos de entrada, excepto startOfWeek, está ausente o establecido en
null, osi la unidad es
weeky startOfWeek no está presente o está configurado ennull.
Utiliza el calendario gregoriano proleptico para las fechas anteriores al año 1583.
Tiene en cuenta el horario de verano, pero no los segundos intercalares.
binSize y unit campos
En conjunto, binSize y unit especifican el período de tiempo utilizado en el cálculo $dateTrunc.
Por ejemplo:
Si binSize es
1y unit eshour, el período de tiempo es una hora. Para la fecha2021-03-20T11:30:05Z,$dateTruncdevuelve2021-03-20T11:00:00Z.Si binSize es
2y unit eshour, el período de tiempo es de dos horas. Para la fecha2021-03-20T11:30:05Z,$dateTruncdevuelve2021-03-20T10:00:00Z.
Divide el tiempo para el cálculo
$dateTruncen binSize períodos de tiempo en la unidad de tiempo especificada.Los períodos de tiempo comienzan en una fecha de referencia, que viene determinada por la unidad. Si la unidad es:
Una cadena distinta de
week,$dateTruncutiliza una fecha de referencia de2000-01-01T00:00:00.00Z. Por ejemplo, si binSize es10y unit esyear, los períodos de tiempo de ejemplo son:2000-01-01T00:00:00.00Z2010-01-01T00:00:00.00Z2020-01-01T00:00:00.00Z
Igual que
week,$dateTruncutiliza una fecha de referencia que se establece en el primer día de la semana más temprano que sea mayor o igual que2000-01-01. El primer día se establece usando startOfWeek (el valor predeterminado es domingo).
Devuelve el límite inferior del período de tiempo en el que se encuentra la fecha. El límite se devuelve como un ISODate.Si el campo binSize es
1,$dateTruncestablece las partes menos significativas (determinadas por la unidad) del ISODate devuelto en0y mantiene el resto del ISODate sin cambios.
Si la unidad es:
year:$dateTruncdevuelve la ISODate para el inicio de enero 1 para el año en fecha.quarter:$dateTruncdevuelve la fecha ISO para el inicio del primer día del trimestre calendario en fecha.Los trimestres son:
De enero a marzo
Abril a junio
julio a septiembre
De octubre a diciembre
month:$dateTruncdevuelve la ISODate para el inicio del primer día del mes en fecha.week:$dateTruncdevuelve la fecha ISO para el inicio del día startOfWeek en formato de fecha. El valor predeterminado para startOfWeek es domingo.day:$dateTruncdevuelve la ISODate para el inicio del día en fecha.hour:$dateTruncdevuelve el ISODate para el inicio de la hora en la fecha.minute:$dateTruncdevuelve la ISODate para el inicio del minuto en la fecha.second:$dateTruncdevuelve la ISODate para el inicio del segundo en la fecha.
unit y startOfWeek campos
Si la unidad es:
Se ignora cualquier cadena distinta de
week, startOfWeek.Igual a
weeky startOfWeek es:Especificado:
$dateTruncutiliza startOfWeek como el primer día de la semana para el cálculo.Omitido:
$dateTruncutiliza el domingo como inicio de la semana para el cálculo.
Ejemplos
Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y Washington (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 } ] )
La colección cakeSales se utiliza en los siguientes ejemplos.
Truncar fechas de pedidos en una etapa de pipeline $project
Este ejemplo utiliza $dateTrunc en una etapa $project para truncar los valores de ventas de pasteles orderDate a dos semanas:
db.cakeSales.aggregate( [ { $project: { _id: 1, orderDate: 1, truncatedOrderDate: { $dateTrunc: { date: "$orderDate", unit: "week", binSize: 2, timezone: "America/Los_Angeles", startOfWeek: "Monday" } } } } ] )
En el ejemplo:
$projectincluye los campos_id,orderDateytruncatedOrderDateen el resultado.$dateTruncTrunca el campoorderDatea un período de tiempo de2binSizeweekunidad en la zona horariaAmerica/Los_Angelescon startOfWeek establecido enMonday.
En este resultado de ejemplo, el orderDate truncado se muestra en el campo 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") } ]
Truncar las fechas de pedido y obtener la suma total de la cantidad en una etapa de pipeline $group
Este ejemplo utiliza $dateTrunc en una etapa $group para truncar los valores de ventas de pasteles orderDate a seis meses y devolver la suma de los valores quantity:
db.cakeSales.aggregate( [ { $group: { _id: { truncatedOrderDate: { $dateTrunc: { date: "$orderDate", unit: "month", binSize: 6 } } }, sumQuantity: { $sum: "$quantity" } } } ] )
En el ejemplo:
$grouptiene el campo_idconfigurado en el campotruncatedOrderDatepara agrupar los documentoscakeSales, y devuelve la suma de los valoresquantitypara cada grupo utilizando$sum.$dateTruncTrunca el campoorderDatea un período de tiempo unitario6binSizemonth.
En este ejemplo de salida, el orderDate truncado se muestra en el campo truncatedOrderDate y la suma quantity se muestra en el campo 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 } ]