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

5 façons d'obtenir le mois à partir d'une date dans MongoDB

MongoDB fournit un certain nombre d'opérateurs de pipeline d'agrégation pour travailler avec des dates, y compris des 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. Vous pouvez donc utiliser JavaScript pour extraire des valeurs de date et des parties de date, etc. à partir d'un champ selon les besoins.

Cet article présente 5 façons de renvoyer la partie mois 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 mois à partir de born champ de ces documents.

Le $month Opérateur

Le $month est spécialement conçu pour renvoyer un document avec la partie mois d'une date donnée.

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

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

Résultat :

{ "birthMonth" : 1 }
{ "birthMonth" : 12 }
{ "birthMonth" : 9 }

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

Voir MongoDB $month 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 mois est renvoyée si nécessaire.

Il existe des spécificateurs de format pour chaque partie de date. Le %m le spécificateur de format renvoie le mois.

Exemple :

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

Résultat :

{ "birthMonth" : "01" }
{ "birthMonth" : "12" }
{ "birthMonth" : "09" }

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

On pourrait donc utiliser $dateToParts dans une étape de pipeline, puis ajoutez une autre étape de pipeline qui extrait le month 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
	}
}

Ce résultat peut ensuite être transmis à l'étape suivante du pipeline pour extraire uniquement le month champ.

Voici ce qui se passe si nous ajoutons une autre projection uniquement pour le month champ :

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

Résultat :

{ "birthMonth" : 1 }
{ "birthMonth" : 12 }
{ "birthMonth" : 9 }

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

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 getMonth() ou getUTCMonth() pour renvoyer uniquement la valeur du mois.

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

Résultat :

0
11
8

Notez que le getMonth() La méthode JavaScript renvoie le numéro du mois sous la forme d'un nombre entier, compris entre 0 et 11.

Vous pouvez également remarquer que les options précédentes renvoient un document entier contenant une paire nom/valeur, alors que cette option renvoie uniquement la valeur réelle du mois, et non le document entier.

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.getMonth();
    return c;
  }
);

Résultat :

[ 0, 11, 8 ] 

Encore une fois, nous obtenons les mois sous forme d'entiers compris entre 0 et 11.