MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDb Gruppieren nach Monat und Jahr aus Zeichenfolge

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.