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

8 façons d'obtenir le jour d'une date dans MongoDB

Lors de l'extraction du jour d'une date, l'option exacte que nous utilisons dépendra de la façon dont nous voulons que le jour soit représenté.

Par exemple, voulons-nous le jour de la semaine, le jour du mois ou le jour de l'année ? Ou peut-être le voulons-nous au format ISO 8601 ? La valeur de retour sera généralement différente selon celle que nous choisissons.

Cet article explore ces options et présente donc 8 façons de renvoyer la partie jour à 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 jour à partir de born champ de ces documents.

Le $dayOfWeek Opérateur

Comme son nom l'indique, le $dayOfWeek renvoie le jour de la semaine à partir d'une date.

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

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

Résultat :

{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }

Il est également possible de spécifier le fuseau horaire lors de l'utilisation du $dayOfWeek opérateur.

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

Le $dayOfMonth Opérateur

Le $dayOfMonth renvoie le jour du mois à partir d'une date.

Exemple :

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

Résultat :

{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }

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

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

Le $dayOfYear Opérateur

Oui, vous l'avez deviné. Le $dayOfYear renvoie le jour de l'année à partir d'une date.

Exemple :

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

Résultat :

{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }

Le $dayOfYear L'opérateur accepte également un paramètre de fuseau horaire.

Voir MongoDB $dayOfYear 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 jour est retournée si nécessaire.

Il existe des spécificateurs de format pour chaque partie de date, et en ce qui concerne la partie jour, vous avez le choix entre plusieurs spécificateurs de format selon que vous souhaitez renvoyer le jour de la semaine, le jour du mois, le jour de l'année ou le jour de la semaine au format ISO 8601.

Exemple :

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty()

Résultat :

{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "03",
	"birthDayOfYear" : "003",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "08",
	"birthDayOfYear" : "342",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "5",
	"birthDayOfMonth" : "24",
	"birthDayOfYear" : "268",
	"birthDayOfWeekISO" : "4"
}

Nous aurions pu fournir plus de spécificateurs de format pour inclure d'autres parties de date dans le résultat, mais comme nous ne sommes intéressés que par l'extraction du jour dans cet article, nous n'avons utilisé que des spécificateurs de format pour renvoyer la partie jour.

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

Voir aussi MongoDB $dateToString Spécificateurs de format pour une liste de spécificateurs de format que vous pouvez utiliser avec $dateToString .

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 peut donc utiliser $dateToParts dans une étape de pipeline, puis ajoutez une autre étape de pipeline qui extrait le day partie si nécessaire.

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 le day champ.

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

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

Résultat :

{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 }

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.

Il convient également de mentionner que $dateToParts accepte 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 pour renvoyer uniquement la valeur du jour.

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

Résultat :

1
0
4

Dans ce cas, nous utilisons le JavaScript getDay() qui renvoie un nombre entier, compris entre 0 et 6, correspondant au jour de la semaine pour la date donnée, selon l'heure locale.

Une autre option consiste à utiliser le getUTCDay() méthode qui utilise le temps universel. Nous utiliserons cette méthode dans l'exemple suivant.

Alternativement, nous aurions pu utiliser le JavaScript getDate() , qui renvoie un nombre entier, compris entre 1 et 31, représentant le jour du mois pour la date donnée.

De plus, cette option renvoie uniquement la valeur réelle du jour, et non le document entier, comme dans les exemples précédents.

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

Résultat :

[ 0, 0, 4 ]

Comme mentionné, le JavaScript getUTCDay() La méthode renvoie son résultat en utilisant le temps universel. Dans ce cas, une valeur différente a été renvoyée pour le premier document (nous avons obtenu 0 dans cet exemple, contre 1 dans le précédent).

Le $isoDayOfWeek Opérateur

Si vous devez renvoyer le jour de la semaine au format ISO 8601, vous pouvez utiliser $isoDayOfWeek . 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,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Résultat :

{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }

Dans ce cas, nous obtenons un résultat complètement différent de celui que nous avons obtenu en utilisant le $dayOfWeek opérateur, en raison de la façon dont ISO 8601 calcule les dates.

Voici un exemple qui illustre cette différence :

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Résultat :

{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }