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

MongoDB $isoSemana

En MongoDB, el $isoWeek el operador de canalización de agregación devuelve el número de semana en formato ISO 8601, que va desde 1 a 53 .

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

La $isoWeek 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 la semana ISO del born campo en ese documento.

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

Resultado:

{ "birthIsoWeek" : 53 } 

Podemos ver que la semana ISO es en realidad la 53, aunque la fecha es en enero. Esto se debe a que la semana comenzó al final del año anterior y aún no ha terminado. Así funcionan las semanas ISO.

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

Cuando haces esto, el argumento pasa a $isoWeek 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 la semana ISO en dos zonas horarias diferentes, cada una con los ID de zona horaria de Olson:

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

Resultado:

{ "honolulu" : 53, "auckland" : 1 } 

En este caso, la fecha avanza a la siguiente semana ISO cuando se usa 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": { 
            $isoWeek: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeek: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Resultado:

{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }

Retornar la Semana ISO desde un ObjectId

Puedes usar $isoWeek para devolver la parte de la semana 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 $isoWeek para devolver la semana 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"},
          "isoWeek": { $isoWeek: "$_id" }
        }
    }
  ]
).pretty()

Resultado:

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

Podemos ver que el documento se creó en la tercera semana del año cuando se usa el formato ISO 8601.

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.

¿Qué es una 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.