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

5 façons d'obtenir l'heure d'une date dans MongoDB

MongoDB fournit une bonne gamme 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, les heures, les minutes, 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 heure d'un objet 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 heure à partir de born champ de ces documents.

Le $hour Opérateur

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

Nous pouvons exécuter le code suivant pour renvoyer la partie heure du born champ dans le document ci-dessus.

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

Résultat :

{ "birthHour" : 23 }
{ "birthHour" : 4 }
{ "birthHour" : 10 }

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

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

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

Exemple :

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

Résultat :

{ "birthHour" : "23" }
{ "birthHour" : "04" }
{ "birthHour" : "10" }

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'heure 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 l'hour 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 l'hour champ.

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

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

Résultat :

{ "birthHour" : 23 }
{ "birthHour" : 4 }
{ "birthHour" : 10 }

Le point ici est, si vous utilisez $dateToParts dans votre pipeline, vous avez automatiquement accès à la portion horaire (et à toutes les autres portions) à l'étape suivante.

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 getHours() ou getUTCHours() pour renvoyer uniquement la valeur de l'heure.

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

Résultat :

23
4
10

Le getUTCHours() La méthode JavaScript renvoie un entier, compris entre 0 et 23, représentant les heures de la date donnée selon le temps universel.

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 de l'heure, 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.getHours();
    return c;
  }
);

Résultat :

[ 9, 14, 20 ]

Vous avez peut-être remarqué que les heures résultantes sont différentes des exemples précédents. C'est parce que dans cet exemple j'ai utilisé le getHours() Méthode JavaScript. Cette méthode renvoie son résultat en fonction de l'heure locale. J'aurais tout aussi bien pu utiliser getUTCHours() .