In MongoDB die $week
Der Aggregations-Pipeline-Operator gibt die Woche des Jahres für ein Datum als Zahl zwischen 0
zurück und 53
.
Bei Verwendung von $week
-Operator können Sie optional eine Zeitzone angeben, die für das Ergebnis verwendet werden soll.
Die $week
-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 die Woche des Jahres von born
zurückzugeben Feld in diesem Dokument.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
birthWeek: { $week: "$born" }
}
}
]
)
Ergebnis:
{ "birthWeek" : 52 }
Wir können sehen, dass die Woche 52 ist.
Hier habe ich birthWeek
verwendet als zurückzugebender Feldname, aber das hätte alles sein können (wie weekBorn
, 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 $week
verwendet werden soll Betreiber.
Wenn Sie dies tun, wird das Argument an $week
ü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 Woche in zwei verschiedenen Zeitzonen ausgibt, die jeweils die Olson-Zeitzonen-IDs verwenden:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$week: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$week: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Ergebnis:
{ "honolulu" : 52, "auckland" : 0 }
In diesem Fall verschiebt sich das Datum auf das nächste Jahr/die nächste Woche, wenn Pacific/Auckland
verwendet wird Zeitzone.
UTC-Offset
Hier ist das gleiche Beispiel, außer dass wir diesmal den UTC-Offset verwenden.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$week: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$week: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Ergebnis:
{ "utcOffset-1000" : 52, "utcOffset+1200" : 0 }
Gib die Woche von einer ObjectId zurück
Sie können $week
verwenden um den 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("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Dieses Dokument enthält eine ObjectId. Wir können daher $week
verwenden um die Woche zurückzugeben, in der 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"},
"week": { $week: "$_id" }
}
}
]
).pretty()
Ergebnis:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "week" : 3 }
Wir können sehen, dass das Dokument in der 3. Woche des Jahres erstellt wurde.
In diesem Fall habe ich auch den $toDate
verwendet Aggregations-Pipeline-Operator, um den Zeitstempelteil der ObjectId zurückzugeben.
ISO-Woche
Sie können auch die $isoWeek
verwenden Operator, um die Wochennummer im ISO 8601-Format zurückzugeben, beginnend bei 1
zu 53
.