Recibo una respuesta de la consulta de agregación de mongoDB que son datos agrupados y campos seleccionados dinámicamente que están en el objeto "projectionObj":
Aquí está mi consulta de agregación mongodb:
let projectionObj = { "date": 1, "height": 1, "bmi": 1, "level": 1, } UpdateForm.aggregate([ { $match: { "id": id, "date": { "$gte": startdate, "$lte": enddate, }}}, { $group: { _id: { year: { $year: "$date" }, month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, }, items: { $push: '$$ROOT', }}}, {$project: { "_id": 0, "items": projectionObj }}, ])Y a continuación se muestra el resultado de la agregación :
[ { items: [{ date: "2022-03-11", height: '1', bmi: '1', level: '1' }, { date: "2022-03-11", height: '2', bmi: '2', level: '2' }] }, { items: [{ date: "2022-03-08", height: '3', bmi: '3', level: '3' }] } ]Quiero formatear el resultado de la agregación al formato deseado que se proporciona a continuación
{ categories: ["2022-03-11", "2022-03-11", "2022-03-08"], series: [ {name: "height", data: [1,2,3]}, {name: "bmi", data: [1,2,3]}, {name: "level", data: [1,2,3]}, ] }primero ejecuté flatMap en la matriz y obtuve una matriz de elementos individuales. luego ejecutó reduce para agrupar las series según los nombres y para agregar fechas a categories .
Pero ahora la serie es un objeto. para convertirlo en una matriz según lo necesite, anulé la series en el resultado final para tomar la matriz de valores agrupados usando Object.values
let a = [ { items: [{ date: "2022-03-11", height: '1', bmi: '1', level: '1' }, { date: "2022-03-11", height: '2', bmi: '2', level: '2' }] }, { items: [{ date: "2022-03-08", height: '3', bmi: '3', level: '3' }] } ] let res = a.flatMap(el => el.items).reduce((acc,{date,...curr})=>{ acc.categories.push(date) Object.entries(curr).forEach(([k,v])=>{ if(!acc.series[k])acc.series[k]={name:k,data:[]} acc.series[k].data.push(parseInt(v)) }) return acc; },{categories:[],series:{}}) res = {...res,series:Object.values(res.series)} console.log(res) .as-console-wrapper { max-height: 100% !important; top: 0; }