U kunt de operators voor datumaggregatie
niet gebruiken op al het andere dat een Date
is
object zelf. Uw ultieme beste optie is om deze "strings" te converteren naar de juiste Date
objecten, zodat u deze en toekomstige bewerkingen correct kunt opvragen.
Dat gezegd hebbende, als je "strings" altijd een gemeenschappelijke structuur hebben, dan is er een manier om dit te doen met de aggregatieraamwerk
hulpmiddelen. Het vereist veel manipulatie-denken dat dit geen "optimale" benadering maakt om het probleem aan te pakken. Maar met een vaste structuur van "dubbele cijfers" en een consistent scheidingsteken is dit mogelijk met de $substr
operator:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Dus JavaScript-casting werkt niet binnen het aggregatieraamwerk. U kunt altijd invoer naar de pijplijn "invoeren" op basis van de evaluatie van de "clientcode", maar het aggregatieproces zelf evalueert geen code. Net als de basisquery-engine is dit allemaal gebaseerd op een "datastructuur"-implementatie die gebruikmaakt van "native operator"-instructies om het werk te doen.
U kunt tekenreeksen niet converteren naar datums in de aggregatiepijplijn. Je zou moeten werken met echte BSON Date
objecten, maar je kunt het doen met strings als er een consistent formaat is dat je in een "lexicale volgorde" kunt presenteren.
Ik raad je toch aan om deze om te zetten naar BSON Dates
ZSM. En pas op dat de "ISODate" of UTC-waarde is geconstrueerd met een andere tekenreeksvorm. dat wil zeggen:
new Date("2020-01-07")
In "jjjj-mm-dd" formaat zijn. Tenminste voor de JavaScript-aanroep.