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

MongoDB $isoWeekYear

Dans MongoDB, le $isoWeekYear L'opérateur de pipeline d'agrégation renvoie l'année de numérotation des semaines ISO pour une valeur de date donnée. Il s'agit du numéro de l'année au format ISO 8601.

Lors de l'utilisation de $isoWeekYear opérateur, vous pouvez éventuellement spécifier un fuseau horaire à utiliser pour le résultat.

Le $isoWeekYear 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 l'année ISO du born champ dans ce document.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

Résultat :

{ "birthIsoWeekYear" : NumberLong(2020) } 

Nous pouvons voir que l'année ISO est en fait 2020, même si la date spécifie 2021. C'est parce que l'année ISO ne se termine pas avant la fin de la semaine dernière. Et dans ce cas, la semaine a commencé à la fin de l'année précédente, et n'a pas encore fini. C'est ainsi que fonctionnent les années ISO.

Ici, j'ai utilisé birthIsoWeekYear comme nom de champ à renvoyer, mais cela aurait pu être n'importe quoi (comme isoWeekYear , isoYear , 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 du $isoWeekYear opérateur.

Lorsque vous faites cela, l'argument est passé à $isoWeekYear 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 l'année ISO dans deux fuseaux horaires différents, chacun utilisant les ID de fuseau horaire Olson :

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
)

Résultat :

{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) } 

Dans ce cas, la date passe à l'année 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": { 
            $isoWeekYear: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeekYear: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Résultat :

{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) } 

Renvoyer l'année ISO à partir d'un ObjectId

Vous pouvez utiliser $isoWeekYear pour renvoyer la partie année ISO 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 $isoWeekYear pour renvoyer l'année ISO de création de notre document (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"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Résultat :

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"timeStamp" : ISODate("2021-01-21T00:24:05Z"),
	"isoWeekYear" : NumberLong(2021)
}

Nous pouvons voir que le document a été créé dans l'année ISO 2021.

Dans ce cas, j'ai également utilisé le $toDate opérateur de pipeline d'agrégation pour renvoyer la partie horodatage de l'ObjectId.

À propos du système de date de 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.