sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDb Cómo agrupar por mes y año desde una cadena

No puede usar los operadores de agregación de fechas en cualquier otra cosa que sea un Date objeto mismo. Su mejor opción definitiva es convertir estas "cadenas" a un Date objetos para que pueda consultar correctamente en esta y futuras operaciones.

Dicho esto, si sus "cadenas" siempre tienen una estructura común, hay una forma de hacerlo con el marco de agregación instrumentos. Requiere mucho pensamiento de manipulación que no hace de este un enfoque "óptimo" para tratar el problema. Pero con una estructura establecida de "dobles dígitos" y un delimitador consistente, esto es posible con $substr operador:

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

Entonces, la conversión de JavaScript no funciona dentro del marco de agregación. Siempre puede "alimentar" la entrada a la canalización en función de la evaluación del "código de cliente", pero el proceso de agregación en sí no evalúa ningún código. Al igual que el motor de consulta básico, todo esto se basa en una implementación de "estructura de datos" que usa instrucciones de "operador nativo" para hacer el trabajo.

No puede convertir cadenas en fechas en la canalización de agregación. Debería trabajar con BSON Date real. objetos, pero puede hacerlo con cadenas si hay un formato consistente que puede presentar en un "orden léxico".

Todavía sugiero que los convierta a BSON Dates CUANTO ANTES Y tenga en cuenta que el valor "ISODate" o UTC se construye con una forma de cadena diferente. es decir:

new Date("2020-01-07")

Estar en formato "yyyy-mm-dd". Al menos para la invocación de JavaScript.