In MongoDB, de $isoWeek
aggregatiepijplijnoperator retourneert het weeknummer in ISO 8601-indeling, variërend van 1
tot 53
.
Bij gebruik van de $isoWeek
operator, kunt u optioneel een tijdzone specificeren die voor het resultaat moet worden gebruikt.
De $isoWeek
operator accepteert een datum (als een datum, een tijdstempel of een object-ID) of een document dat de te gebruiken datum en tijdzone specificeert.
Voorbeeld
Stel dat we een verzameling hebben met de naam cats
met het volgende document:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
We kunnen de volgende code uitvoeren om de ISO-week te extraheren uit de born
veld in dat document.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeek: { $isoWeek: "$born" }
}
}
]
)
Resultaat:
{ "birthIsoWeek" : 53 }
We kunnen zien dat de ISO-week eigenlijk 53 is, ook al is de datum in januari. Dit komt omdat de week eind vorig jaar begon en nog niet is afgelopen. Zo werken ISO-weken.
Hier gebruikte ik birthIsoWeek
als de veldnaam die moet worden geretourneerd, maar dit kan van alles zijn (zoals isoWeek
, week
, enzovoort).
De _id
veld wordt standaard geretourneerd bij het gebruik van projecties in MongoDB, maar in dit voorbeeld heb ik de _id
expliciet verborgen veld met _id: 0
.
Geef een tijdzone op
U kunt een tijdzone specificeren die moet worden gebruikt voor de uitvoer van de $isoWeek
telefoniste.
Wanneer u dit doet, wordt het argument doorgegeven aan $isoWeek
moet de volgende vorm hebben:
{ date: <dateExpression>, timezone: <tzExpression> }
Waar <dateExpression>
is de te gebruiken datum, en <tzExpression>
is de te gebruiken tijdzone.
De tijdzone kan worden opgegeven met behulp van de Olson-tijdzone-ID (bijv. "Europe/London"
, "GMT"
) of de UTC-offset (bijv. "+02:30"
, "-1030"
).
Olson tijdzone-ID
Hier is een voorbeeld dat de ISO-week in twee verschillende tijdzones uitvoert, elk met de Olson-tijdzone-ID's:
db.cats.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$isoWeek: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeek: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Resultaat:
{ "honolulu" : 53, "auckland" : 1 }
In dit geval gaat de datum vooruit naar de volgende ISO-week bij gebruik van de Pacific/Auckland
tijdzone.
UTC-offset
Hier is hetzelfde voorbeeld, behalve dat we deze keer de UTC-offset gebruiken.
db.cats.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$isoWeek: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeek: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Resultaat:
{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }
Retourneer de ISO-week van een ObjectId
U kunt $isoWeek
. gebruiken om het ISO-weekgedeelte van een ObjectId te retourneren.
ObjectId-waarden zijn hexadecimale waarden van 12 bytes die bestaan uit:
- Een tijdstempelwaarde van 4 byte, die de creatie van de ObjectId vertegenwoordigt, gemeten in seconden sinds het Unix-tijdperk.
- Een 5 byte is een willekeurige waarde
- Een oplopende teller van 3 bytes, geïnitialiseerd op een willekeurige waarde.
Samenvattend ziet ons document er als volgt uit:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Dit document bevat een ObjectId. We kunnen daarom $isoWeek
. gebruiken om de ISO-week terug te geven waarin ons document is gemaakt (of meer specifiek, wanneer de _id
de ObjectId-waarde van het veld is gemaakt).
Voorbeeld:
db.cats.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"isoWeek": { $isoWeek: "$_id" }
}
}
]
).pretty()
Resultaat:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeek" : 3 }
We kunnen zien dat het document in de 3e week van het jaar is gemaakt bij gebruik van het ISO 8601-formaat.
In dit geval heb ik ook de $toDate
. gebruikt aggregatiepijplijnoperator om het tijdstempelgedeelte van de ObjectId te retourneren.
Wat is een ISO-week?
Het ISO-weekdatumsysteem is een kalendersysteem dat deel uitmaakt van de ISO 8601-norm voor datum en tijd uitgegeven door de International Organization for Standardization (ISO). Het systeem specificeert een weekjaar bovenop de Gregoriaanse kalender door een notatie te definiëren voor ordinale weken van het jaar.
ISO-weeknummeringsjaren hebben 52 of 53 volle weken. Dit betekent dat er 364 of 371 dagen in het jaar zitten, in plaats van de gebruikelijke 365 of 366 dagen.
ISO-weken beginnen met maandag. Het jaar van elke ISO-week is het Gregoriaanse jaar waarin de donderdag valt. ISO-weeknummers beginnen bij 1
met de week die de eerste donderdag van het jaar bevat.