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

MongoDB $ isoSettimanaAnno

In MongoDB, il $isoWeekYear l'operatore della pipeline di aggregazione restituisce l'anno di numerazione delle settimane ISO per un determinato valore di data. Questo è il numero dell'anno nel formato ISO 8601.

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

Il $isoWeekYear 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 l'anno ISO da born campo in quel documento.

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

Risultato:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Possiamo vedere che l'anno ISO è in realtà il 2020, anche se la data specifica il 2021. Questo perché l'anno ISO non finisce fino alla fine dell'ultima settimana. E in questo caso, la settimana è iniziata alla fine dell'anno precedente e deve ancora finire. Ecco come funzionano gli anni ISO.

Qui ho usato birthIsoWeekYear come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come isoWeekYear , isoYear , 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 $isoWeekYear operatore.

Quando lo fai, l'argomento è passato a $isoWeekYear 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 l'anno ISO in due fusi orari diversi, ciascuno dei quali utilizza gli ID fuso orario Olson:

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

Risultato:

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

In questo caso, la data avanza all'anno ISO successivo 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": { 
            $isoWeekYear: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeekYear: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Risultato:

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

Restituisci l'anno ISO da un ObjectId

Puoi usare $isoWeekYear per restituire la parte dell'anno 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 $isoWeekYear per restituire l'anno 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"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Risultato:

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

Possiamo vedere che il documento è stato creato nell'anno ISO 2021.

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

Informazioni sul sistema di date settimanali 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.