MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $isoWeekYear

In MongoDB das $isoWeekYear Der Aggregations-Pipeline-Operator gibt das ISO-Jahr mit Wochennummerierung für einen bestimmten Datumswert zurück. Dies ist die Jahreszahl im Format ISO 8601.

Bei Verwendung von $isoWeekYear -Operator können Sie optional eine Zeitzone angeben, die für das Ergebnis verwendet werden soll.

Das $isoWeekYear -Operator akzeptiert entweder ein Datum (entweder als Date, Timestamp oder ObjectId) oder ein Dokument, das das zu verwendende Datum und die zu verwendende Zeitzone angibt.

Beispiel

Angenommen, wir haben eine Sammlung namens cats mit folgendem Dokument:

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

Wir können den folgenden Code ausführen, um das ISO-Jahr aus born zu extrahieren Feld in diesem Dokument.

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

Ergebnis:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Wir können sehen, dass das ISO-Jahr tatsächlich 2020 ist, obwohl das Datum 2021 angibt. Dies liegt daran, dass das ISO-Jahr nicht endet, bis die letzte Woche endet. Und in diesem Fall hat die Woche am Ende des Vorjahres begonnen und muss noch enden. So funktionieren ISO-Jahre.

Hier habe ich birthIsoWeekYear verwendet als zurückzugebender Feldname, aber das hätte alles sein können (wie isoWeekYear , isoYear , etc).

Die _id Das Feld wird standardmäßig zurückgegeben, wenn Projektionen in MongoDB verwendet werden, aber in diesem Beispiel habe ich die _id explizit ausgeblendet Feld mit _id: 0 .

Geben Sie eine Zeitzone an

Sie können eine Zeitzone angeben, die für die Ausgabe von $isoWeekYear verwendet werden soll Betreiber.

Wenn Sie dies tun, wird das Argument an $isoWeekYear übergeben muss folgende Form haben:

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

Wobei <dateExpression> ist das zu verwendende Datum und <tzExpression> ist die zu verwendende Zeitzone.

Die Zeitzone kann entweder mit der Olson-Zeitzonenkennung (z. B. "Europe/London" , "GMT" ) oder den UTC-Offset (z. B. "+02:30"). , "-1030" ).

Olson-Zeitzonenkennung

Hier ist ein Beispiel, das das ISO-Jahr in zwei verschiedenen Zeitzonen ausgibt, die jeweils die Olson-Zeitzonen-IDs verwenden:

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

Ergebnis:

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

In diesem Fall verschiebt sich das Datum bei Verwendung von Pacific/Auckland auf das nächste ISO-Jahr Zeitzone.

UTC-Offset

Hier ist das gleiche Beispiel, außer dass wir diesmal den UTC-Offset verwenden.

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

Ergebnis:

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

Gib das ISO-Jahr aus einer ObjectId zurück

Sie können $isoWeekYear verwenden um den Teil des ISO-Jahres aus einer ObjectId zurückzugeben.

ObjectId-Werte sind 12-Byte-Hexadezimalwerte, die aus Folgendem bestehen:

  • Ein 4-Byte-Zeitstempelwert, der die Erstellung der ObjectId darstellt, gemessen in Sekunden seit der Unix-Epoche.
  • Ein 5 Byte ist ein Zufallswert
  • Ein 3-Byte-Zähler, der auf einen zufälligen Wert initialisiert wird.

Zusammenfassend sieht unser Dokument so aus:

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

Dieses Dokument enthält eine ObjectId. Wir können daher $isoWeekYear verwenden um das ISO-Jahr zurückzugeben, in dem unser Dokument erstellt wurde (oder genauer gesagt, wann die _id der ObjectId-Wert des Felds wurde erstellt).

Beispiel:

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

Ergebnis:

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

Wir können sehen, dass das Dokument im ISO-Jahr 2021 erstellt wurde.

In diesem Fall habe ich auch den $toDate verwendet Aggregations-Pipeline-Operator, um den Zeitstempelteil der ObjectId zurückzugeben.

Über das ISO-Wochendatumssystem

Das ISO-Wochendatumssystem ist ein Kalendersystem, das Teil des Datums- und Uhrzeitstandards ISO 8601 ist, der von der International Organization for Standardization (ISO) herausgegeben wird. Das System gibt ein Wochenjahr über dem gregorianischen Kalender an, indem es eine Notation für ordinale Wochen des Jahres definiert.

ISO-Jahre mit Wochennummerierung haben entweder 52 oder 53 volle Wochen. Das bedeutet, dass das Jahr statt der üblichen 365 oder 366 Tage entweder 364 oder 371 Tage hat.

ISO-Wochen beginnen mit Montag. Jedes Jahr der ISO-Woche ist das gregorianische Jahr, in das der Donnerstag fällt. ISO-Wochennummern beginnen bei 1 mit der Woche, die den ersten Donnerstag des Jahres enthält.