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

MongoDb Comment regrouper par mois et par année à partir d'une chaîne

Vous ne pouvez pas utiliser les opérateurs d'agrégation de date sur tout ce qui est une Date objet lui-même. Votre meilleure option ultime est de convertir ces "chaînes" en bon Date objets afin que vous puissiez interroger correctement dans cette opération et dans les opérations futures.

Cela dit, si vos "chaînes" ont toujours une structure commune, il existe un moyen de le faire avec le framework d'agrégation outils. Cela nécessite beaucoup de réflexion sur la manipulation, ce qui n'en fait pas une approche "optimale" pour traiter le problème. Mais avec une structure définie de "double chiffres" et un délimiteur cohérent, cela est possible avec le $substr opérateur :

db.collection.aggregate([
   { "$group": {
       "_id": {
           "year": { "$substr": [ "$dateStr", 7, 4 ] },
           "month": { "$substr": [ "$dateStr", 4, 2 ] }
       },
       "count": { "$sum": 1 }
   }}
])

Ainsi, le casting JavaScript ne fonctionne pas dans le cadre d'agrégation. Vous pouvez toujours "alimenter" le pipeline en fonction de l'évaluation du "code client", mais le processus d'agrégation lui-même n'évalue aucun code. Tout comme le moteur de requête de base, tout cela est basé sur une implémentation de "structure de données" qui utilise des instructions "d'opérateur natif" pour effectuer le travail.

Vous ne pouvez pas convertir des chaînes en dates dans le pipeline d'agrégation. Vous devriez travailler avec la vraie BSON Date objets, mais vous pouvez le faire avec des chaînes s'il existe un format cohérent que vous pouvez présenter dans un "ordre lexical".

Je vous suggère toujours de les convertir en BSON Dates AU PLUS VITE. Et méfiez-vous que la valeur "ISODate" ou UTC est construite avec une forme de chaîne différente. c'est-à-dire :

new Date("2020-01-07")

Être au format "aaaa-mm-jj". Au moins pour l'invocation de JavaScript.