sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $dateToString

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.