En MongoDB, el $dateToParts
El operador de canalización de agregación devuelve las partes de fecha de una fecha determinada.
Más específicamente, devuelve un documento que contiene las partes constituyentes de un valor de Fecha BSON dado como propiedades individuales.
Las partes de fecha devueltas por $dateToParts
son year
, month
, day
, hour
, minute
, second
y millisecond
.
Al usar el $dateToParts
operador, puede especificar opcionalmente una zona horaria para usar para el resultado.
El $dateToParts
El operador acepta una fecha (como una fecha, una marca de tiempo o un Id. de objeto) o un documento que especifica la fecha y la zona horaria a utilizar.
Ejemplo
Supongamos que tenemos una colección llamada pets
con el siguiente documento:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Podemos ejecutar el siguiente código para devolver las distintas partes de la fecha del born
campo en ese documento.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Resultado:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Podemos ver que cada parte de la fecha se devuelve en su propio campo.
Aquí, usé dateParts
como el nombre del campo a devolver, pero podría haber sido cualquier cosa (como theDate
etc).
El _id
El campo se devuelve de forma predeterminada cuando se usan proyecciones en MongoDB, pero en este ejemplo oculté explícitamente el _id
campo usando _id: 0
.
Especifique una zona horaria
Puede especificar una zona horaria para usar para la salida de $dateToParts
operador.
Cuando haces esto, el argumento pasa a $dateToParts
debe ser de la siguiente forma:
{ date: <dateExpression>, timezone: <tzExpression> }
Donde <dateExpression>
es la fecha a usar, y <tzExpression>
es la zona horaria a utilizar.
La zona horaria se puede especificar utilizando el identificador de zona horaria de Olson (por ejemplo, "Europe/London"
, "GMT"
) o el desplazamiento UTC (por ejemplo, "+02:30"
, "-1030"
).
Identificador de zona horaria de Olson
Aquí hay un ejemplo que genera las partes de la fecha en dos zonas horarias diferentes, cada una con los ID de zona horaria de Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
).pretty()
Resultado:
{ "honolulu" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "auckland" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 12, "minute" : 30, "second" : 15, "millisecond" : 123 } }
En este caso, la fecha avanza al siguiente año/mes/semana/día/hora cuando se utiliza el Pacific/Auckland
zona horaria.
Desplazamiento UTC
Este es el mismo ejemplo, excepto que esta vez usamos el desplazamiento UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$dateToParts: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$dateToParts: { date: "$born", timezone: "+1200" }
}
}
}
]
).pretty()
Resultado:
{ "utcOffset-1000" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "utcOffset+1200" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 11, "minute" : 30, "second" : 15, "millisecond" : 123 } }
ISO Semana Fecha Piezas
Puedes usar iso8601: true
para modificar el documento de salida para usar campos de fecha de semana ISO. Esto basa la fecha en el estándar ISO 8601.
Supongamos que tenemos una colección llamada cats
con el siguiente documento:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Podemos ejecutar el siguiente código para extraer los campos de fecha ISO del born
campo en ese documento.
Aquí hay un ejemplo para demostrarlo:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateParts: {
$dateToParts: {
date: "$born"
}
},
datePartsISO: {
$dateToParts: {
date: "$born",
iso8601: true
}
}
}
}
]
).pretty()
Resultado:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 }, "datePartsISO" : { "isoWeekYear" : 2020, "isoWeek" : 53, "isoDayOfWeek" : 4, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
El primer documento de salida utiliza la salida de fecha normal. El segundo documento utiliza los campos y valores de fecha de la semana ISO.
Devolver las partes de fecha de un ObjectId
Puedes usar $dateToParts
para devolver las partes de fecha de un ObjectId.
Los valores de ObjectId son valores hexadecimales de 12 bytes que constan de:
- Un valor de marca de tiempo de 4 bytes, que representa la creación del ObjectId, medido en segundos desde la época de Unix.
- Un byte de 5 es un valor aleatorio
- Un contador incremental de 3 bytes, inicializado a un valor aleatorio.
En resumen, nuestro documento se ve así:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Este documento contiene un ObjectId. Por lo tanto, podemos usar $dateToParts
para devolver las partes de la fecha, en función de la fecha en que se creó nuestro documento (o más específicamente, cuando el _id
se creó el valor ObjectId del campo).
Ejemplo:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"dateParts": { $dateToParts: { date: "$_id" } }
}
}
]
).pretty()
Resultado:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "dateParts" : { "year" : 2021, "month" : 1, "day" : 19, "hour" : 1, "minute" : 11, "second" : 35, "millisecond" : 0 } }
En este caso, también usé el $toDate
operador de canalización de agregación para devolver la parte de la marca de tiempo del ObjectId.