MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ isoSettimana

In MongoDB, il $isoWeek l'operatore della pipeline di aggregazione restituisce il numero della settimana nel formato ISO 8601, compreso tra 1 a 53 .

Quando si utilizza $isoWeek operatore, puoi facoltativamente specificare un fuso orario da utilizzare per il risultato.

La $isoWeek operatore accetta una data (come una data, un timestamp o un ObjectId) o un documento che specifica la data e il fuso orario da utilizzare.

Esempio

Supponiamo di avere una collezione chiamata cats con il seguente documento:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Possiamo eseguire il codice seguente per estrarre la settimana ISO da born campo in quel documento.

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

Risultato:

{ "birthIsoWeek" : 53 } 

Possiamo vedere che la settimana ISO è in realtà 53, anche se la data è a gennaio. Questo perché la settimana è iniziata alla fine dell'anno precedente e deve ancora finire. Ecco come funzionano le settimane ISO.

Qui ho usato birthIsoWeek come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come isoWeek , week , eccetera).

Il _id il campo viene restituito per impostazione predefinita quando si utilizzano le proiezioni in MongoDB, ma in questo esempio ho nascosto esplicitamente _id campo utilizzando _id: 0 .

Specifica un fuso orario

Puoi specificare un fuso orario da utilizzare per l'output di $isoWeek operatore.

Quando lo fai, l'argomento è passato a $isoWeek deve essere della seguente forma:

{ date: <dateExpression>, timezone: <tzExpression> }

Dove <dateExpression> è la data da utilizzare e <tzExpression> è il fuso orario da utilizzare.

Il fuso orario può essere specificato utilizzando l'identificatore del fuso orario Olson (ad es. "Europe/London" , "GMT" ) o l'offset UTC (ad es. "+02:30" , "-1030" ).

Identificatore di fuso orario Olson

Ecco un esempio che restituisce la settimana ISO in due fusi orari diversi, ciascuno dei quali utilizza gli ID fuso orario Olson:

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

Risultato:

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

In questo caso, la data avanza alla settimana ISO successiva quando si utilizza il Pacific/Auckland fuso orario.

Offset UTC

Ecco lo stesso esempio, tranne che questa volta usiamo l'offset UTC.

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

Risultato:

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

Restituisci la settimana ISO da un ObjectId

Puoi usare $isoWeek per restituire la parte della settimana ISO da un ObjectId.

I valori ObjectId sono valori esadecimali a 12 byte costituiti da:

  • Un valore di timestamp di 4 byte, che rappresenta la creazione dell'ObjectId, misurato in secondi dall'epoca di Unix.
  • Un 5 byte è un valore casuale
  • Un contatore incrementale di 3 byte, inizializzato su un valore casuale.

Per ricapitolare, il nostro documento si presenta così:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Questo documento contiene un ObjectId. Possiamo quindi utilizzare $isoWeek per restituire la settimana ISO in cui è stato creato il nostro documento (o più specificamente, quando il _id è stato creato il valore ObjectId del campo).

Esempio:

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

Risultato:

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

Possiamo vedere che il documento è stato creato la 3a settimana dell'anno utilizzando il formato ISO 8601.

In questo caso, ho utilizzato anche $toDate operatore della pipeline di aggregazione per restituire la parte timestamp di ObjectId.

Cos'è una settimana ISO?

Il sistema di data della settimana ISO è un sistema di calendario che fa parte dello standard di data e ora ISO 8601 emesso dall'Organizzazione internazionale per la standardizzazione (ISO). Il sistema specifica un anno settimanale in cima al calendario gregoriano definendo una notazione per le settimane ordinali dell'anno.

Gli anni di numerazione delle settimane ISO hanno 52 o 53 settimane intere. Ciò significa che ci sono 364 o 371 giorni nell'anno, invece dei soliti 365 o 366 giorni.

Le settimane ISO iniziano con lunedì. Ogni anno della settimana ISO è l'anno gregoriano in cui cade il giovedì. I numeri della settimana ISO iniziano da 1 con la settimana che contiene il primo giovedì dell'anno.