Du kan ikke bruge datoaggregationsoperatorerne
på alt andet, der er en Date
objektet selv. Din ultimative bedste mulighed er at konvertere disse "strenge" til korrekte Date
objekter, så du kan forespørge korrekt i denne og fremtidige operationer.
Når det er sagt, hvis dine "strenge" altid har en fælles struktur, så er der en måde at gøre dette på med aggregeringsramme
værktøjer. Det kræver en masse manipulationstanke, der ikke gør dette til en "optimal" tilgang til at håndtere problemet. Men med en fast struktur med "dobbeltcifre" og en konsekvent afgrænsning er dette muligt med $substr
operatør:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Så JavaScript-casting fungerer ikke inden for aggregeringsrammen. Du kan altid "feede" input til pipelinen baseret på "klientkode"-evaluering, men selve aggregeringsprocessen evaluerer ikke nogen kode. Ligesom den grundlæggende forespørgselsmotor er dette alt sammen baseret på en "datastruktur"-implementering, der bruger "native operator"-instruktioner til at udføre arbejdet.
Du kan ikke konvertere strenge til datoer i aggregeringspipelinen. Du bør arbejde med ægte BSON Date
objekter, men du kan gøre det med strenge, hvis der er et konsistent format, som du kan præsentere i en "leksikalsk rækkefølge".
Jeg foreslår stadig, at du konverterer disse til BSON Dates
ASAP. Og pas på, at "ISOdate"- eller UTC-værdien er konstrueret med en anden strengform. dvs.:
new Date("2020-01-07")
I formatet "åååå-mm-dd". I det mindste for JavaScript-indkaldelsen.