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.