Dans MongoDB, la $isoWeek
l'opérateur de pipeline d'agrégation renvoie le numéro de semaine au format ISO 8601, allant de 1
à 53
.
Lors de l'utilisation de la $isoWeek
opérateur, vous pouvez éventuellement spécifier un fuseau horaire à utiliser pour le résultat.
La $isoWeek
L'opérateur accepte soit une date (sous forme de Date, d'horodatage ou d'ObjectId), soit un document qui spécifie la date et le fuseau horaire à utiliser.
Exemple
Supposons que nous ayons une collection appelée cats
avec le document suivant :
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Nous pouvons exécuter le code suivant pour extraire la semaine ISO du born
champ dans ce document.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeek: { $isoWeek: "$born" }
}
}
]
)
Résultat :
{ "birthIsoWeek" : 53 }
Nous pouvons voir que la semaine ISO est en fait 53, même si la date est en janvier. En effet, la semaine a commencé à la fin de l'année précédente et n'est pas encore terminée. C'est ainsi que fonctionnent les semaines ISO.
Ici, j'ai utilisé birthIsoWeek
comme nom de champ à renvoyer, mais cela aurait pu être n'importe quoi (comme isoWeek
, week
, etc).
Le _id
le champ est renvoyé par défaut lors de l'utilisation de projections dans MongoDB, mais dans cet exemple, j'ai explicitement caché le _id
champ utilisant _id: 0
.
Spécifiez un fuseau horaire
Vous pouvez spécifier un fuseau horaire à utiliser pour la sortie de la $isoWeek
opérateur.
Lorsque vous faites cela, l'argument est passé à $isoWeek
doit être de la forme suivante :
{ date: <dateExpression>, timezone: <tzExpression> }
Où <dateExpression>
est la date à utiliser, et <tzExpression>
est le fuseau horaire à utiliser.
Le fuseau horaire peut être spécifié à l'aide de l'identifiant de fuseau horaire Olson (par exemple, "Europe/London"
, "GMT"
) ou le décalage UTC (par exemple "+02:30"
, "-1030"
).
Identifiant de fuseau horaire Olson
Voici un exemple qui génère la semaine ISO dans deux fuseaux horaires différents, chacun utilisant les ID de fuseau horaire Olson :
db.cats.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$isoWeek: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeek: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Résultat :
{ "honolulu" : 53, "auckland" : 1 }
Dans ce cas, la date avance à la semaine ISO suivante lors de l'utilisation du Pacific/Auckland
fuseau horaire.
Décalage UTC
Voici le même exemple, sauf que cette fois nous utilisons le décalage UTC.
db.cats.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$isoWeek: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeek: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Résultat :
{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }
Renvoyer la semaine ISO à partir d'un ObjectId
Vous pouvez utiliser $isoWeek
pour renvoyer la partie semaine ISO à partir d'un ObjectId.
Les valeurs ObjectId sont des valeurs hexadécimales de 12 octets qui se composent de :
- Une valeur d'horodatage de 4 octets, représentant la création de l'ObjectId, mesurée en secondes depuis l'époque Unix.
- A 5 octets est une valeur aléatoire
- Un compteur incrémentant de 3 octets, initialisé à une valeur aléatoire.
Pour récapituler, notre document ressemble à ceci :
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Ce document contient un ObjectId. On peut donc utiliser $isoWeek
pour renvoyer la semaine ISO à laquelle notre document a été créé (ou plus précisément, lorsque le _id
la valeur ObjectId du champ a été créée).
Exemple :
db.cats.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"isoWeek": { $isoWeek: "$_id" }
}
}
]
).pretty()
Résultat :
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeek" : 3 }
Nous pouvons voir que le document a été créé la 3ème semaine de l'année en utilisant le format ISO 8601.
Dans ce cas, j'ai également utilisé le $toDate
opérateur de pipeline d'agrégation pour renvoyer la partie horodatage de l'ObjectId.
Qu'est-ce qu'une semaine ISO ?
Le système de date de semaine ISO est un système de calendrier qui fait partie de la norme de date et d'heure ISO 8601 publiée par l'Organisation internationale de normalisation (ISO). Le système spécifie une année hebdomadaire au-dessus du calendrier grégorien en définissant une notation pour les semaines ordinales de l'année.
Les années de numérotation des semaines ISO comptent 52 ou 53 semaines complètes. Cela signifie qu'il y a 364 ou 371 jours dans l'année, au lieu des 365 ou 366 jours habituels.
Les semaines ISO commencent le lundi. L'année de chaque semaine ISO est l'année grégorienne dans laquelle tombe le jeudi. Les numéros de semaine ISO commencent à 1
avec la semaine qui contient le premier jeudi de l'année.