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

MongoDB $dateToString

Dans MongoDB, le $dateToString L'opérateur de pipeline d'agrégation convertit un objet de date donné en une chaîne.

Le $dateToString L'opérateur accepte une date, un horodatage ou un ObjectId.

Vous pouvez spécifier un format à utiliser pour le résultat en fournissant une spécification de format. La spécification de format peut être n'importe quel littéral de chaîne, contenant 0 ou plusieurs spécificateurs de format.

La spécification de format est facultative à partir de la version 4.0 de MongoDB, lorsque featureCompatibilityVersion est défini sur 4.0 ou plus. Les versions antérieures nécessitent la spécification du format.

Vous pouvez éventuellement utiliser le timezone paramètre pour spécifier le fuseau horaire à utiliser.

Vous pouvez également utiliser le onNull paramètre pour spécifier ce qu'il faut retourner si la date est null ou manquant.

Exemple

Supposons que nous ayons une collection appelée pets avec le document suivant :

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Nous pouvons exécuter le code suivant pour renvoyer une chaîne de date à partir du born champ dans ce document.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
       }
     }
   ]
)

Résultat :

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Cet exemple utilise %Y-%m-%dT%H:%M:%S.%LZ comme spécification de format. Il s'agit de la spécification de format par défaut, mais dans ce cas, nous l'avons explicitement spécifié. Nous pouvons voir que la chaîne de date est renvoyée en utilisant le format spécifié.

Ici, j'ai utilisé dateString comme nom de champ à renvoyer, mais cela aurait pu être n'importe quoi (comme formattedDate , theDate 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 .

Voir MongoDB $dateToString Spécificateurs de format pour une liste des spécificateurs de format disponibles.

Sortie par défaut

Comme mentionné, la spécification de format dans l'exemple précédent est la spécification de format par défaut.

Si vous utilisez MongoDB version 4.0 ou supérieure, avec featureCompatibilityVersion défini sur 4.0 ou supérieur (voir comment afficher votre featureCompatibilityVersion actuel et comment le définir), vous pouvez omettre la spécification du format si vous souhaitez que la date soit formatée en utilisant le format ci-dessus.

Par conséquent, nous pourrions réécrire le précédent. exemple à ceci :

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { date: "$born" } }
       }
     }
   ]
)

Résultat :

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Spécifiez un fuseau horaire

Vous pouvez spécifier un fuseau horaire à utiliser pour la sortie du $dateToString opérateur.

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 la chaîne de date dans trois fuseaux horaires différents, chacun utilisant les ID de fuseau horaire Olson :

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
       }
     }
   ]
).pretty()

Résultat :

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T12:30"
}

Décalage UTC

Voici un exemple qui utilise le décalage UTC.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
       }
     }
   ]
).pretty()

Résultat :

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T11:30"
}

Format de date de la semaine ISO

Il existe quelques spécificateurs de format qui vous permettent de générer la chaîne de date au format ISO 8601.

Vous pouvez notamment utiliser :

Spécificateur de format Sortie
%G Année au format ISO 8601
%u Numéro du jour de la semaine au format ISO 8601 (1-lundi, 7-dimanche)
%V Semaine de l'année au format ISO 8601

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 les champs de date ISO du born champ dans ce document.

Voici un exemple pour illustrer :

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          isoYear: { $dateToString: { format: "%G", date: "$born" } },
          isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
          isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
       }
     }
   ]
)

Résultat :

{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }

En revanche, ci-dessous est le même exemple, mais en utilisant les parties de date de semaine non ISO.

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          year: { $dateToString: { format: "%Y", date: "$born" } },
          dayofweek: { $dateToString: { format: "%w", date: "$born" } },
          weekofyear: { $dateToString: { format: "%U", date: "$born" } }
       }
     }
   ]
)

Résultat :

{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }

On voit que le résultat est complètement différent.

Le onNull Paramètre

Le onNull Le paramètre peut être utilisé pour spécifier ce qu'il faut retourner si la date est nulle ou n'existe pas.

La valeur fournie au onNull le paramètre peut être n'importe quelle expression valide.

Voici un exemple :

db.pets.aggregate(
   [
     {
       $project: {
          _id: 0,
          dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
       }
     }
   ]
)

Résultat :

{ "dateString" : "No date supplied" }

Dans ce cas, la date était null et donc le document de sortie inclut la chaîne que j'ai fournie pour le onNull paramètre.

Renvoyer les parties de date d'un ObjectId

Vous pouvez utiliser $dateToString pour renvoyer une chaîne de date à partir 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 premier document ressemble à ceci :

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Ce document contient un ObjectId. On peut donc utiliser $dateToString pour renvoyer une chaîne de date, basée sur la date à laquelle notre document a été créé (ou plus précisément, lorsque le _id la valeur ObjectId du champ a été créée).

Exemple :

db.pets.aggregate(
   [
     {
       $project: {
          timestamp: { $toDate: "$_id" },
          dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
       }
     }
   ]
).pretty()

Résultat :

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timestamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateString" : "19-01-2021"
}

Dans ce cas, j'ai décidé de renvoyer uniquement la partie date (pas la partie heure). J'ai également inversé l'ordre des jours, des mois et des années pour démontrer que vous pouvez certainement le faire si nécessaire.

J'ai aussi utilisé le $toDate opérateur de pipeline d'agrégation pour renvoyer la partie horodatage de l'ObjectId.