I MongoDB, $isoWeekYear
aggregeringspipeline-operatören returnerar ISO-veckonummeråret för ett givet datumvärde. Detta är årstalet i ISO 8601-format.
När du använder $isoWeekYear
operatör kan du valfritt ange en tidszon som ska användas för resultatet.
$isoWeekYear
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-året från born
fältet i det dokumentet.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Resultat:
{ "birthIsoWeekYear" : NumberLong(2020) }
Vi kan se att ISO-året faktiskt är 2020, även om datumet anger 2021. Detta beror på att ISO-året inte slutar förrän den sista veckan är slut. Och i det här fallet började veckan i slutet av föregående år och har ännu inte avslutats. Så här fungerar ISO-år.
Här använde jag birthIsoWeekYear
som fältnamnet att returnera, men detta kan ha varit vad som helst (som isoWeekYear
, isoYear
, 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 $isoWeekYear
operatör.
När du gör detta skickades argumentet till $isoWeekYear
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-året i två olika tidszoner, var och en med hjälp av Olsons tidszons-ID:
db.cats.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Resultat:
{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) }
I det här fallet flyttas datumet framåt till nästa ISO-år 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": {
$isoWeekYear: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeekYear: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Resultat:
{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) }
Återställ ISO-året från ett ObjectId
Du kan använda $isoWeekYear
för att returnera ISO-årsdelen 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 $isoWeekYear
för att returnera ISO-året 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"},
"isoWeekYear": { $isoWeekYear: "$_id" }
}
}
]
).pretty()
Resultat:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeekYear" : NumberLong(2021) }
Vi kan se att dokumentet skapades under ISO-året 2021.
I det här fallet använde jag också $toDate
aggregeringspipeline-operatör för att returnera tidsstämpeldelen av ObjectId.
Om ISO Week Date System
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.