MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $ isoWeek

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> }

<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.