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

MongoDB $isoWeekYear

En MongoDB, el $isoWeekYear El operador de canalización de agregación devuelve el año de numeración de semana ISO para un valor de fecha determinado. Este es el número de año en formato ISO 8601.

Al usar el $isoWeekYear operador, puede especificar opcionalmente una zona horaria para usar para el resultado.

El $isoWeekYear 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 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 el año ISO del born campo en ese documento.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Podemos ver que el año ISO es en realidad 2020, aunque la fecha especifica 2021. Esto se debe a que el año ISO no termina hasta que finaliza la última semana. Y en este caso, la semana comenzó a fines del año anterior y aún no ha terminado. Así funcionan los años ISO.

Aquí, usé birthIsoWeekYear como el nombre del campo a devolver, pero podría haber sido cualquier cosa (como isoWeekYear , isoYear , 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 $isoWeekYear operador.

Cuando haces esto, el argumento pasa a $isoWeekYear 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

Este es un ejemplo que genera el año ISO en dos zonas horarias diferentes, cada una de las cuales utiliza los ID de zona horaria de Olson:

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
)

Resultado:

{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) } 

En este caso, la fecha avanza al siguiente año ISO cuando se usa el Pacific/Auckland zona horaria.

Desplazamiento UTC

Este es el mismo ejemplo, excepto que esta vez usamos el desplazamiento UTC.

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $isoWeekYear: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeekYear: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Resultado:

{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) } 

Retornar el Año ISO desde un ObjectId

Puedes usar $isoWeekYear para devolver la parte del año ISO 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("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Este documento contiene un ObjectId. Por lo tanto, podemos usar $isoWeekYear para devolver el año ISO en que se creó nuestro documento (o más específicamente, cuando el _id se creó el valor ObjectId del campo).

Ejemplo:

db.cats.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Resultado:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"timeStamp" : ISODate("2021-01-21T00:24:05Z"),
	"isoWeekYear" : NumberLong(2021)
}

Podemos ver que el documento fue creado en el año ISO 2021.

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.

Acerca del sistema de fecha de la semana ISO

El sistema de fecha de semana ISO es un sistema de calendario que forma parte del estándar de fecha y hora ISO 8601 emitido por la Organización Internacional de Normalización (ISO). El sistema especifica un año de semana además del calendario gregoriano definiendo una notación para las semanas ordinales del año.

Los años de numeración de semanas ISO tienen 52 o 53 semanas completas. Esto significa que hay 364 o 371 días en el año, en lugar de los habituales 365 o 366 días.

Las semanas ISO comienzan el lunes. El año de cada semana ISO es el año gregoriano en el que cae el jueves. Los números de semana ISO comienzan en 1 con la semana que contiene el primer jueves del año.