Mi esquema se ve así:
Profesor.js
const teacherSchema = new mongoose.Schema( { name: { type: String, required: true, unique: true, }, }, { timestamps: true, } ); teacherSchema.virtual('students', { ref: 'Student', localField: '_id', foreignField: 'teacher', justOne: false }) const Teacher = mongoose.model('Teacher', teacherSchema);Estudiante.js
const studentSchema = new mongoose.Schema( { name: { type: String, required: true, }, teacher: { type: mongoose.Schema.Types.ObjectId, ref: 'Teacher', required: true, }, }, { timestamps: true, } ); menuItemSchema.virtual('courses', { ref: 'Course', localField: '_id', foreignField: 'student', justOne: false }) const Student = mongoose.model('Student', studentSchema);Curso.js
const courseSchema = new mongoose.Schema( { name: { type: String, required: true, }, student: { type: mongoose.Schema.Types.ObjectId, ref: 'Student', required: true, } }, { timestamps: true, } ); mongoose.model('Course', coursesSchema)En mi enrutador, quiero crear un objeto que tenga el siguiente aspecto y devolvérselo al usuario:
{ <teacherName>: [ <studentName1>: [<courseName1>, <courseName2>, <courseName3>], <studentName2>: [<courseName1>, <courseName2>, <courseName3>] ] }Para realizar esto, necesito hacer una unión múltiple entre las 3 tablas. ¿Cuál es la forma más eficiente de hacer esto?
En el caso de solo dos tablas hago:
const teacherWithStudents = await (await Teacher.findOne({_id: req.params.teacherId}).populate('students')).execPopulate()Sin embargo, dado que hay otra tabla, también hay forma de completar los cursos de los estudiantes para que puedan acceder a los 3: el maestro, sus estudiantes y cada uno de sus cursos.
Puede profundizar más con .populate() de la siguiente manera:
Teacher.findOne({_id: req.params.teacherId}) .populate({ path: 'students', populate: { path: 'courses' } }) .exec(function(err, docs) {});Documentación adicional: https://mongoosejs.com/docs/populate.html#deep-populate