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

6 façons d'obtenir l'année à partir d'une date dans MongoDB

MongoDB fournit un certain nombre d'opérateurs de pipeline d'agrégation pour travailler avec des dates. Cela inclut les opérateurs qui extraient certaines parties de dates, telles que l'année, le mois, le jour, etc.

Il existe également quelques méthodes MongoDB qui vous permettent de parcourir un curseur et d'appliquer une fonction JavaScript. Cela vous permet donc d'utiliser JavaScript pour extraire des valeurs de date et des parties de date, etc. d'un champ.

Cet article présente 6 façons de renvoyer la partie année à partir d'une date dans MongoDB.

Exemple de données

Supposons que nous ayons une collection appelée cats avec les documents suivants :

{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
{ "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") }
{ "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }

Les exemples suivants illustrent diverses options pour renvoyer la partie année à partir de born champ de ces documents.

Le $year Opérateur

Le $year est le choix le plus évident pour extraire la partie année d'une date. Il est spécifiquement conçu pour renvoyer un document avec la partie année d'une date.

Nous pouvons exécuter le code suivant pour renvoyer l'année à partir du born champ dans le document ci-dessus.

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

Résultat :

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

Vous pouvez également spécifier le fuseau horaire lorsque vous utilisez le $year opérateur.

Voir MongoDB $year pour plus d'informations et d'exemples.

Le $dateToString Opérateur

Le $dateToString L'opérateur convertit un objet date en une chaîne selon un format spécifié par l'utilisateur. L'utilisateur peut donc spécifier que seule la partie année est renvoyée si nécessaire.

Il existe des spécificateurs de format pour chaque partie de date. Le %Y le spécificateur de format renvoie l'année.

Exemple :

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthYear: { $dateToString: { format: "%Y", date: "$born" } }
       }
     }
   ]
)

Résultat :

{ "birthYear" : "2021" }
{ "birthYear" : "2019" }
{ "birthYear" : "2020" }

Nous aurions pu fournir plus de spécificateurs de format pour inclure des parties de date dans le résultat, mais comme nous ne souhaitons extraire que l'année dans cet article, nous n'avons utilisé qu'un seul spécificateur de format.

Voir MongoDB $dateToString pour plus d'informations et d'exemples.

Le $dateToParts Opérateur

Le $dateToParts L'opérateur renvoie un document qui contient les parties constitutives d'une valeur de date BSON donnée en tant que propriétés individuelles. Les propriétés renvoyées sont year , month , day , hour , minute , second et millisecond .

Armés de cette connaissance, nous pouvons utiliser $dateToParts dans une étape de pipeline, puis ajoutez une autre étape de pipeline qui extrait l'year partie.

Voici ce que $dateToParts retours pour nos trois documents :

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

Résultat :

{
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 3,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}
{
	"dateParts" : {
		"year" : 2019,
		"month" : 12,
		"day" : 8,
		"hour" : 4,
		"minute" : 0,
		"second" : 12,
		"millisecond" : 0
	}
}
{
	"dateParts" : {
		"year" : 2020,
		"month" : 9,
		"day" : 24,
		"hour" : 10,
		"minute" : 30,
		"second" : 0,
		"millisecond" : 0
	}
}

Ces données peuvent être transmises à l'étape suivante du pipeline pour extraire uniquement l'year champ.

Voici ce qui se passe si nous ajoutons une autre projection uniquement pour l'year champ :

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthYear: "$dateParts.year"
        }
    }
  ]
)

Résultat :

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

Ce n'est évidemment pas aussi concis que d'utiliser les options précédentes. Cependant, selon ce que vous faites dans votre pipeline, cette approche pourrait être une option pratique.

Le $dateToParts l'opérateur accepte également un iso8601 paramètre, qui modifie le document de sortie pour utiliser les champs de date de semaine ISO.

Voir MongoDB $dateToParts pour plus d'informations et d'exemples.

Le forEach() Méthode

Vous pouvez utiliser cursor.forEach() pour parcourir le curseur, en utilisant une méthode JavaScript telle que getFullYear() ou getUTCFullYear() pour renvoyer uniquement la valeur de l'année.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getFullYear()
      );
  }
);

Résultat :

2021
2019
2020

Les options précédentes renvoient un document entier contenant une paire nom/valeur. Cette option renvoie uniquement la valeur réelle de l'année, et non l'intégralité du document.

La map() Méthode

Le cursor.map() La méthode applique une fonction à chaque document visité par le curseur et combine les valeurs dans un tableau.

Exemple :

db.cats.find().map(
  function(c) {
    c = c.born.getFullYear();
    return c;
  }
);

Résultat :

[ 2021, 2019, 2020 ]

Le $isoWeekYear Opérateur

Si vous devez renvoyer l'année au format ISO 8601, utilisez $isoWeekYear . L'année ISO 8601 commence par le lundi de la semaine 1 et se termine par le dimanche de la dernière semaine.

Exemple :

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

Résultat :

{ "birthIsoWeekYear" : NumberLong(2020) }
{ "birthIsoWeekYear" : NumberLong(2019) }
{ "birthIsoWeekYear" : NumberLong(2020) }

Notez que la première année est maintenant 2020 au lieu de 2021 comme dans les exemples précédents. Toutes les années ne seront pas différentes lors de l'utilisation de $isoWeekYear , car cela dépend de la date en question.