MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDb Come raggruppare per mese e anno dalla stringa

Non è possibile utilizzare gli operatori di aggregazione di date su qualsiasi altra cosa che sia una Date oggetto stesso. L'ultima opzione migliore è convertire queste "stringhe" in Date oggetti in modo da poter interrogare correttamente in questa e nelle operazioni future.

Detto questo, se le tue "stringhe" hanno sempre una struttura comune, allora c'è un modo per farlo con framework di aggregazione Strumenti. Richiede un sacco di pensiero manipolativo che non rende questo un approccio "ottimale" per affrontare il problema. Ma con una struttura prestabilita di "doppie cifre" e un delimitatore coerente ciò è possibile con $substr operatore:

db.collection.aggregate([
   { "$group": {
       "_id": {
           "year": { "$substr": [ "$dateStr", 7, 4 ] },
           "month": { "$substr": [ "$dateStr", 4, 2 ] }
       },
       "count": { "$sum": 1 }
   }}
])

Quindi il casting JavaScript non funziona all'interno del framework di aggregazione. È sempre possibile "alimentare" l'input nella pipeline in base alla valutazione del "codice client", ma il processo di aggregazione stesso non valuta alcun codice. Proprio come il motore di query di base, tutto questo si basa su un'implementazione della "struttura dei dati" che utilizza le istruzioni dell'"operatore nativo" per svolgere il lavoro.

Non è possibile convertire stringhe in date nella pipeline di aggregazione. Dovresti lavorare con BSON Dates oggetti, ma puoi farlo con le stringhe se esiste un formato coerente che puoi presentare in un "ordine lessicale".

Ti suggerisco comunque di convertirli in BSON Dates AL PIÙ PRESTO. E fai attenzione che il valore "ISODate" o UTC è costruito con una forma di stringa diversa. cioè:

new Date("2020-01-07")

Essere nel formato "aaaa-mm-gg". Almeno per l'invocazione di JavaScript.