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

MongoDB $isoDayOfWeek

In MongoDB der $isoDayOfWeek Der Aggregations-Pipeline-Operator gibt die Wochentagnummer im ISO 8601-Format zurück, beginnend bei 1 (für Montag) bis 7 (für Sonntag).

Sie können optional eine Zeitzone angeben, die für das Ergebnis verwendet werden soll.

Der $isoDayOfWeek -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 pets mit folgendem Dokument:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

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

db.pets.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Ergebnis:

{ "birthIsoDayOfWeek" : 4 } 

In diesem Fall erhalten wir ein Ergebnis von 4, was ein anderes Ergebnis ist als das, was ich erhalte, wenn ich $dayOfWeek verwende Operator gegen dasselbe Dokument.

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

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

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

Ergebnis:

{ "honolulu" : 4, "auckland" : 5 }

UTC-Offset

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

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

Ergebnis:

{ "utcOffset-1000" : 4, "utcOffset+1200" : 5 }

Gibt den Wochentag von einer ObjectId zurück

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

Zusammenfassend sieht unser Dokument folgendermaßen aus:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

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

Beispiel:

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

Ergebnis:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"isoDayOfWeek" : 2
}

Wir können sehen, dass das Dokument am 2. Tag der Woche 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.