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.