Du kan inte använda operatorerna för datumaggregation
på allt annat som är ett Date
objektet självt. Ditt bästa alternativ är att konvertera dessa "strängar" till korrekta Date
objekt så att du kan fråga korrekt i denna och framtida operationer.
Som sagt, om dina "strängar" alltid har en gemensam struktur så finns det ett sätt att göra detta med aggregationsramverk
verktyg. Det kräver mycket manipulationstänkande som inte gör detta till ett "optimalt" tillvägagångssätt för att hantera problemet. Men med en uppsättning struktur med "dubbla siffror" och en konsekvent avgränsare är detta möjligt 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 fungerar inte inom aggregeringsramverket. Du kan alltid "mata" indata till pipelinen baserat på "klientkod"-utvärdering, men själva aggregeringsprocessen utvärderar ingen kod. Precis som den grundläggande frågemotorn är allt detta baserat på en "datastruktur"-implementering som använder "native operator"-instruktioner för att utföra arbetet.
Du kan inte konvertera strängar till datum i aggregeringspipelinen. Du bör arbeta med riktiga BSON Date
objekt, men du kan göra det med strängar om det finns ett konsekvent format som du kan presentera i en "lexikal ordning".
Jag föreslår fortfarande att du konverterar dessa till BSON Date
SÅ FORT SOM MÖJLIGT. Och se upp att "ISODate" eller UTC-värdet är konstruerat med en annan strängform. dvs:
new Date("2020-01-07")
I formatet "åååå-mm-dd". Åtminstone för JavaScript-anropet.