Censo de Agregación de MongoDB
Me gustaría agregar estos datos, necesito contar los objetos por mes, como un censo. Para cada artículo tengo una fecha de llegada y una fecha de salida, este artículo tiene la suma +1 en los meses dentro de este rango. ¿Cómo puedo hacer esto?
DATOS:
[{
_id:1
history:
[
{_id:1, date:2021-03-01, type:"Departure"},
{_id:2, date:2021-01-01, type:"Arrival"}
]
},
{
_id:2
history:
[
{_id:1, date:2021-07-03, type:"Departure"},
{_id:2, date:2021-02-10, type:"Arrival"}
]
},
{
_id:3
history:
[
{_id:1, date:2021-08-22, type:"Departure"},
{_id:2, date:2021-11-5, type:"Arrival"}
]
}]
RESULTADO:
[
{month:1, year:2021, counter:1},
{month:2, year:2021, counter:2},
{month:3, year:2021, counter:2},
{month:3, year:2021, counter:1},
{month:4, year:2021, counter:1},
{month:5, year:2021, counter:1},
{month:6, year:2021, counter:1},
{month:7, year:2021, counter:0},
{month:8, year:2021, counter:1},
{month:9, year:2021, counter:1},
{month:10, year:2021, counter:1},
{month:11, year:2021, counter:1},
{month:12, year:2021, counter:0}
]
davy.ai
Para lograr el resultado deseado, podemos hacer uso del
framework de agregación
de MongoDB. Específicamente, podemos utilizar las etapas del pipeline$match
,$unwind
,$project
,$group
y$sort
para transformar los datos de entrada en el resultado deseado.Aquí está cómo se ve el pipeline:
Vamos a desglosarlo:
$match
filtra los documentos sin un array de historial.$unwind
desnormaliza el arrayhistory
en documentos separados.$project
selecciona solo los campos que necesitamos, es decir,month
yyear
.$group
agrupa los documentos pormonth
yyear
, y cuenta el número de documentos en cada grupo utilizando el acumulador$sum
.$sort
ordena la salida poryear
ymonth
.$project
da formato a la salida para que coincida con el formato del resultado deseado.La salida final es un array de objetos, donde cada objeto tiene los campos
month
,year
ycounter
. El campocounter
representa el número de elementos que tuvieron al menos una ocurrencia en ese mes.Ten en cuenta que el rango de meses y años en la salida dependerá del rango de fechas en los datos de entrada.