I MongoDB, $isoWeek
aggregeringspipeline-operatören returnerar veckonummer i ISO 8601-format, från 1
till 53
.
När du använder $isoWeek
operatör kan du valfritt ange en tidszon som ska användas för resultatet.
$isoWeek
operatören accepterar antingen ett datum (som antingen ett datum, en tidsstämpel eller ett objekt-ID), eller ett dokument som anger datum och tidszon som ska användas.
Exempel
Anta att vi har en samling som heter cats
med följande dokument:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Vi kan köra följande kod för att extrahera ISO-veckan från born
fältet i det dokumentet.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeek: { $isoWeek: "$born" }
}
}
]
)
Resultat:
{ "birthIsoWeek" : 53 }
Vi kan se att ISO-veckan faktiskt är 53, trots att datumet är i januari. Detta beror på att veckan började i slutet av föregående år och ännu inte är slut. Så här fungerar ISO-veckor.
Här använde jag birthIsoWeek
som fältnamnet att returnera, men detta kunde ha varit vad som helst (som isoWeek
, week
, etc).
_id
fältet returneras som standard när man använder projektioner i MongoDB, men i det här exemplet gömde jag uttryckligen _id
fält med _id: 0
.
Ange en tidszon
Du kan ange en tidszon som ska användas för utdata från $isoWeek
operatör.
När du gör detta skickades argumentet till $isoWeek
måste vara av följande form:
{ date: <dateExpression>, timezone: <tzExpression> }
Där <dateExpression>
är datumet att använda och <tzExpression>
är tidszonen som ska användas.
Tidszonen kan specificeras med antingen Olsons tidszonsidentifierare (t.ex. "Europe/London"
, "GMT"
) eller UTC-offset (t.ex. "+02:30"
, "-1030"
).
Olsons tidszonsidentifierare
Här är ett exempel som matar ut ISO-veckan i två olika tidszoner, var och en med hjälp av Olsons tidszons-ID:
db.cats.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$isoWeek: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeek: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Resultat:
{ "honolulu" : 53, "auckland" : 1 }
I det här fallet flyttas datumet framåt till nästa ISO-vecka när du använder Pacific/Auckland
tidszon.
UTC-offset
Här är samma exempel, förutom den här gången använder vi UTC-offset.
db.cats.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$isoWeek: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeek: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Resultat:
{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }
Återställ ISO-veckan från ett ObjectId
Du kan använda $isoWeek
för att returnera ISO-veckodelen från ett ObjectId.
ObjectId-värden är hexadecimala värden på 12 byte som består av:
- Ett tidsstämpelvärde på 4 byte, som representerar objekt-ID:ts skapelse, mätt i sekunder sedan Unix-epoken.
- En 5 byte är ett slumpmässigt värde
- En 3-byte inkrementerande räknare, initierad till ett slumpmässigt värde.
För att sammanfatta ser vårt dokument ut så här:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Detta dokument innehåller ett ObjectId. Vi kan därför använda $isoWeek
för att returnera ISO-veckan som vårt dokument skapades (eller mer specifikt, när _id
fältets ObjectId-värde skapades).
Exempel:
db.cats.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"isoWeek": { $isoWeek: "$_id" }
}
}
]
).pretty()
Resultat:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeek" : 3 }
Vi kan se att dokumentet skapades den 3:e veckan på året när vi använder ISO 8601-formatet.
I det här fallet använde jag också $toDate
aggregeringspipeline-operatör för att returnera tidsstämpeldelen av ObjectId.
Vad är en ISO-vecka?
ISO-veckodatumsystemet är ett kalendersystem som är en del av ISO 8601-standarden för datum och tid som utfärdats av International Organization for Standardization (ISO). Systemet specificerar ett veckoår ovanpå den gregorianska kalendern genom att definiera en notation för ordinarie veckor på året.
ISO-veckor har antingen 52 eller 53 hela veckor. Det betyder att det finns antingen 364 eller 371 dagar på året, istället för de vanliga 365 eller 366 dagar.
ISO-veckorna börjar med måndag. Varje ISO-veckas år är det gregorianska år då torsdagen infaller. ISO-veckonummer börjar på 1
med veckan som innehåller årets första torsdag.