En MongoDB, el $dateToString
El operador de canalización de agregación convierte un objeto de fecha dado en una cadena.
El $dateToString
el operador acepta una fecha, una marca de tiempo o un ID de objeto.
Puede especificar un formato para usar para el resultado proporcionando una especificación de formato. La especificación de formato puede ser cualquier cadena literal, que contenga 0 o más especificadores de formato.
La especificación de formato es opcional desde MongoDB versión 4.0, cuando featureCompatibilityVersion
está establecido en 4.0
o mas alto. Las versiones anteriores requieren la especificación de formato.
Opcionalmente, puede usar la timezone
parámetro para especificar la zona horaria a utilizar.
También puede usar onNull
parámetro para especificar qué devolver si la fecha es null
o falta.
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 una cadena de fecha del born
campo en ese documento.
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Resultado:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Este ejemplo usa %Y-%m-%dT%H:%M:%S.%LZ
como la especificación de formato. Esta es la especificación de formato predeterminada, pero en este caso la especificamos explícitamente. Podemos ver que la cadena de fecha se devuelve usando el formato especificado.
Aquí, usé dateString
como el nombre de campo a devolver, pero esto podría haber sido cualquier cosa (como formattedDate
, 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
.
Ver MongoDB $dateToString
Especificadores de formato para obtener una lista de especificadores de formato disponibles.
Salida predeterminada
Como se mencionó, la especificación de formato en el ejemplo anterior es la especificación de formato predeterminada.
Si está utilizando MongoDB versión 4.0 o superior, con featureCompatibilityVersion
establecido en 4.0
o superior (vea cómo ver su featureCompatibilityVersion
actual y cómo configurarlo), puede omitir la especificación de formato si desea que la fecha tenga el formato anterior.
Por lo tanto, podríamos reescribir lo anterior. ejemplo de esto:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Resultado:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Especifique una zona horaria
Puede especificar una zona horaria para usar para la salida de $dateToString
operador.
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 la cadena de fecha en tres zonas horarias diferentes, cada una con los ID de zona horaria de Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
Resultado:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
Desplazamiento UTC
Aquí hay un ejemplo que usa el desplazamiento UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
Resultado:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
Formato de fecha de semana ISO
Hay algunos especificadores de formato que le permiten generar la cadena de fecha utilizando el formato ISO 8601.
En particular, puede utilizar:
Especificador de formato | Salida |
---|---|
%G | Año en formato ISO 8601 |
%u | Número del día de la semana en formato ISO 8601 (1 lunes, 7 domingo) |
%V | Semana del año en formato 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.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Resultado:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Por el contrario, a continuación se muestra el mismo ejemplo, pero con las partes de la fecha de la semana que no son ISO.
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
Resultado:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Podemos ver que el resultado es completamente diferente.
El onNull
Parámetro
El onNull
El parámetro se puede usar para especificar qué devolver si la fecha es nula o no existe.
El valor proporcionado a onNull
el parámetro puede ser cualquier expresión válida.
He aquí un ejemplo:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Resultado:
{ "dateString" : "No date supplied" }
En este caso, la fecha era null
y entonces el documento de salida incluye la cadena que proporcioné para onNull
parámetro.
Devolver las partes de fecha de un ObjectId
Puedes usar $dateToString
para devolver una cadena 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 primer 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 $dateToString
para devolver una cadena de fecha, basada en 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" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Resultado:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
En este caso, decidí devolver solo la parte de la fecha (no la parte de la hora). También cambié el orden de los días, meses y años para demostrar que ciertamente puede hacer esto si es necesario.
También usé el $toDate
operador de canalización de agregación para devolver la parte de la marca de tiempo del ObjectId.