HOWTO · MongoDB
Convertir l'horodatage en date dans MongoDB
Ce tutoriel explique comment convertir l'horodatage en date dans MongoDB.
Sur cette page
Un horodatage peut correspondre à différentes valeurs BSON : choisissez donc la conversion selon le type enregistré dans le champ. Les horodatages numériques exprimés en millisecondes depuis l’époque Unix et les chaînes contenant ces millisecondes nécessitent des expressions différentes de celles utilisées pour les valeurs BSON Timestamp. Après avoir converti les valeurs en dates BSON, vous pouvez regrouper les documents par jour calendaire à l’aide d’une clé formatée et les compter.
Convertir un horodatage en date dans MongoDB
Commencez par examiner le type du champ dans un document représentatif. Dans l’ancien shell mongo, typeof indique la catégorie de valeur JavaScript ; les valeurs BSON Timestamp peuvent apparaître comme des objets JavaScript. Cette vérification ne suffit donc pas à déterminer leur type BSON exact. Lorsque cette distinction est importante, utilisez l’expression d’agrégation $type : par exemple, {$project: {valueType: {$type: "$datetime"}}} indique le type BSON enregistré pour chaque document.
Les expressions du shell MongoDB présentées ici sont des exemples ; leur exécution n’est pas vérifiée dans cet article. Remplacez collection_name et datetime par les noms de votre collection et de votre champ. La conversion ci-dessous suppose que les valeurs numériques représentent des millisecondes depuis l’époque Unix ; les valeurs exprimées en secondes nécessitent une conversion explicite de l’unité au préalable.
Pour une valeur exprimée en millisecondes depuis l’époque Unix, JavaScript utilise aussi les millisecondes pour Date. Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
console.log(new Date(1655448286502).toISOString());
2022-06-17T06:44:46.502Z
Convertir les horodatages numériques exprimés en millisecondes
Pour un champ numérique contenant des millisecondes depuis l’époque Unix, $toDate de MongoDB convertit le nombre en date BSON. Cet exemple succinct du shell présente l’expression ; adaptez-la à votre collection :
db.collection1.aggregate([{$project: {convertedDate: {$toDate: "$datetime"}}}])
Par exemple, la valeur 1655448286502 correspond à 2022-06-17T06:44:46.502Z. N’appliquez pas cette expression à un nombre exprimé en secondes comme s’il s’agissait de millisecondes : la date obtenue serait très éloignée de l’heure visée. Si la valeur source est en secondes, multipliez-la par 1000 dans l’agrégation avant d’utiliser $toDate.
Convertir les horodatages sous forme de chaîne exprimés en millisecondes
Une chaîne telle que "1655445247168" n’est pas en soi une date ni une valeur BSON numérique. Convertissez cette chaîne numérique en entier 64 bits avec $toLong, puis transmettez le résultat à $toDate :
db.collection2.aggregate([{$project: {convertedDate: {$toDate: {$toLong: "$datetime"}}}}])
Cette méthode suppose que chaque chaîne contient un entier en base 10 représentant des millisecondes depuis l’époque Unix. Les chaînes dans un autre format de date nécessitent une méthode d’analyse adaptée à ce format ; ne les traitez pas comme des nombres de millisecondes. Des erreurs de conversion dans MongoDB peuvent survenir si une valeur ne peut pas être convertie. Vérifiez donc que les valeurs du champ respectent cette hypothèse avant d’appliquer l’expression à toute la collection.
Convertir les valeurs BSON Timestamp
BSON Timestamp est un type BSON distinct, couramment utilisé pour les opérations internes de MongoDB. Ce n’est pas un nombre ordinaire de millisecondes depuis l’époque Unix : il stocke une valeur temporelle en secondes et un ordinal. La documentation de $toDate de MongoDB indique que BSON Timestamp est une entrée prise en charge et que le résultat correspond à la date de cet horodatage. La conversion utilise donc sa valeur temporelle en secondes, et non l’ordinal comme s’il s’agissait de millisecondes ou d’une fraction de seconde. Cela diffère du cas numérique, où $toDate interprète le nombre comme une valeur en millisecondes. Consultez également la documentation BSON Timestamp de MongoDB pour en savoir plus sur les composantes en secondes et l’ordinal de ce type.
Pour un champ qui contient réellement une valeur BSON Timestamp, convertissez-la directement :
db.collection3.aggregate([{$project: {convertedDate: {$toDate: "$datetime"}}}])
La date obtenue représente l’heure de l’horodatage à la seconde près. Elle ne conserve pas l’ordinal comme précision de date, et cette conversion ne rend pas une valeur BSON Timestamp interchangeable avec une heure d’événement métier. Vérifiez que le champ contient bien le type Timestamp et que sa composante en secondes correspond à l’heure que vous souhaitez rapporter.
Regrouper les dates converties et compter les documents par jour
Pour compter les documents par jour, projetez d’abord une date convertie, puis regroupez les résultats à partir d’une valeur produite par $dateToString. La valeur format %Y-%m-%d produit une clé année-mois-jour. L’option timezone ci-dessous définit explicitement le fuseau UTC : le regroupement suit donc les jours du calendrier UTC, et non le fuseau horaire local du serveur de base de données :
db.collection1.aggregate([{$project: {convertedDate: {$toDate: "$datetime"}}}, {$group: {_id: {$dateToString: {format: "%Y-%m-%d", date: "$convertedDate", timezone: "UTC"}}, count: {$sum: 1}}}, {$sort: {_id: 1}}])
Avant le regroupement, utilisez l’expression de conversion correspondante pour les champs de type chaîne ou BSON Timestamp. Le regroupement par chaîne formatée réunit intentionnellement tous les instants qui tombent le même jour dans le fuseau choisi ; la clé obtenue n’est pas une date BSON. Si vous avez besoin d’une autre limite de journée calendaire, choisissez explicitement le fuseau horaire et appliquez-le de manière cohérente. $sum: 1 ajoute une unité pour chaque document du groupe, et le tri par _id facilite la lecture des clés de date obtenues.