Sie können die Datumsaggregationsoperatoren
nicht verwenden auf alles andere, was ein Date
ist
Objekt selbst. Ihre ultimative beste Option besteht darin, diese "Strings" in den richtigen Date
Objekte, damit Sie diese und zukünftige Operationen korrekt abfragen können.
Wenn Ihre "Strings" jedoch immer eine gemeinsame Struktur haben, gibt es eine Möglichkeit, dies mit der Aggregationsframework
Werkzeug. Es erfordert eine Menge Manipulationsgedanken, was dies nicht zu einem "optimalen" Ansatz macht, um mit dem Problem umzugehen. Aber mit einer festen Struktur aus "zwei Ziffern" und einem konsistenten Trennzeichen ist dies mit dem $substr
Betreiber:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Das JavaScript-Casting funktioniert also nicht innerhalb des Aggregationsframeworks. Sie können der Pipeline basierend auf der Auswertung des „Client-Codes“ immer Eingaben „zuführen“, aber der Aggregationsprozess selbst wertet keinen Code aus. Genau wie die grundlegende Abfrage-Engine basiert dies alles auf einer "Datenstruktur"-Implementierung, die "native Operator"-Anweisungen verwendet, um die Arbeit zu erledigen.
Sie können Zeichenfolgen in der Aggregationspipeline nicht in Datumsangaben konvertieren. Sie sollten mit echtem BSON Date
arbeiten
Objekte, aber Sie können es mit Strings machen, wenn es ein konsistentes Format gibt, das Sie in einer "lexikalischen Reihenfolge" darstellen können.
Ich schlage dennoch vor, dass Sie diese in BSON Dates
umwandeln SCHNELLSTMÖGLICH. Und beachten Sie, dass der "ISODate"- oder UTC-Wert mit einer anderen Zeichenfolgenform erstellt wird. dh:
new Date("2020-01-07")
Im Format "JJJJ-MM-TT". Zumindest für den JavaScript-Aufruf.