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

MongoDB $isoWeek

In MongoDB die $isoWeek Der Aggregations-Pipeline-Operator gibt die Wochennummer im ISO 8601-Format zurück, beginnend bei 1 bis 53 .

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

Die $isoWeek -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 die ISO-Woche aus born zu extrahieren Feld in diesem Dokument.

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

Ergebnis:

{ "birthIsoWeek" : 53 } 

Wir können sehen, dass die ISO-Woche tatsächlich 53 ist, obwohl das Datum im Januar liegt. Dies liegt daran, dass die Woche am Ende des Vorjahres begonnen hat und noch nicht zu Ende ist. So funktionieren ISO-Wochen.

Hier habe ich birthIsoWeek verwendet als zurückzugebender Feldname, aber das hätte alles sein können (wie isoWeek , week , 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 $isoWeek verwendet werden soll Betreiber.

Wenn Sie dies tun, wird das Argument an $isoWeek ü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 die ISO-Woche in zwei verschiedenen Zeitzonen ausgibt, die jeweils die Olson-Zeitzonen-IDs verwenden:

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

Ergebnis:

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

In diesem Fall verschiebt sich das Datum bei Verwendung von Pacific/Auckland auf die nächste ISO-Woche 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": { 
            $isoWeek: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeek: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Ergebnis:

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

Gib die ISO-Woche aus einer ObjectId zurück

Sie können $isoWeek verwenden um den ISO-Wochenteil von 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 inkrementierender 3-Byte-Zähler, initialisiert auf einen zufälligen Wert.

Zusammenfassend sieht unser Dokument folgendermaßen aus:

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

Dieses Dokument enthält eine ObjectId. Wir können daher $isoWeek verwenden um die ISO-Woche zurückzugeben, in der 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"},
          "isoWeek": { $isoWeek: "$_id" }
        }
    }
  ]
).pretty()

Ergebnis:

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

Wir können sehen, dass das Dokument in der 3. Woche des Jahres erstellt wurde, wenn das ISO 8601-Format verwendet wird.

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

Was ist eine ISO-Woche?

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.