Estoy construyendo un proyecto paralelo que usa una base de datos mongodb. Estoy usando la pila MERN para crear una aplicación web con mis datos. Estoy usando Mongoose para obtener datos de mi base de datos en un servidor NodeJS/Express para construir mi API REST. Aquí hay un ejemplo de los datos que tengo. Tengo subdocumentos profundamente anidados que necesito recuperar. Cada usuario tiene una matriz de 'contactos'. Cada 'contacto' tiene una serie de 'tareas'. Me gustaría obtener una matriz de todas las tareas anidadas en cada usuario. Por ejemplo, si un usuario tiene 2 contactos y cada contacto tiene 3 tareas, me gustaría una matriz con 6 tareas.
{ userName: 'jdoe', uid: 12343, contacts: [ { name: 'Jane Doe', tasks:[ { taskName: 'Task1' }, { taskName: 'Task2' }, { taskName: 'Task3' }, ] }, { name: 'Bob Smith', tasks:[ { taskName: 'TaskA' }, { taskName: 'TaskB' }, { taskName: 'TaskC' }, ] } ] }Para consultar mis datos con Mongoose, probé algo como esto
User.findOne({uid: req.params.uid}, 'contacts.tasks', (yasks,err)=>{ if(err){ res.send(err) }else{ res.send(tasks) } })Sin embargo, esta consulta devuelve algo como esto
{ "_id": "353453", "contacts": [ { "tasks": [ { taskName: 'Task1' } ] }, { "tasks": [ { taskName: 'Task1' }, { taskName: 'Task1' } ] }, { "tasks": [] }, { "tasks": [] } ] }estoy buscando una respuesta como esta
[ { taskName: 'Task1' }, { taskName: 'Task1' }, taskName: 'Task1' }, { taskName: 'Task1' } ]Me pregunto si hay alguna manera de que pueda hacer esto con Mongoose. Si no, ¿qué tipo de javascript puedo ejecutar para transformar mis datos para que estén estructurados de esta manera?
Puedes usar $reduce para esto:
User.aggregate([ {$match: {uid: req.params.uid}}, { $project: { tasks: { $reduce: { input: "$contacts", initialValue: [], in: {$concatArrays: ["$$value", "$$this.tasks"]} } }, _id: 0 } } ])Vea cómo funciona en el ejemplo del patio de recreo