Estoy tratando de encontrar una manera de verificar si un estudiante está registrado en un curso usando mangosta.
Tengo estos esquemas:
esquema del curso :
const mongoose = require("mongoose"); const User = require("../models/User"); const CourseSchema = new mongoose.Schema( { courseName: { type: String, required: true, unique: true }, teacher: { teacherName: { type: String }, teacherID: { type: mongoose.Schema.Types.ObjectId, ref: "User", }, }, students: [ { studentName: { type: String }, studentID: { type: mongoose.Schema.Types.ObjectId, ref: "User", }, }, ], }, { collection: "courses" }, { timestamps: true } ); module.exports = mongoose.model("Course", CourseSchema);Aquí estoy guardando a todos los estudiantes que firmaron el curso dentro de la matriz de objetos de los estudiantes .
esquema del estudiante:
const mongoose = require("mongoose"); const UserSchema = new mongoose.Schema( { username: { type: String, required: true, unique: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, userType: { type: String, enum: ["student", "teacher"], default: "student", }, isOnline: { type: Boolean, default: false }, }, { collection: "users" }, { timestamps: true } ); module.exports = mongoose.model("User", UserSchema);Ahora estoy tratando de hacer una consulta que devolverá una lista de cursos en los que se inscribió el estudiante.
Por ejemplo:
Si tengo 3 cursos = [matemáticas, inglés, programación] y un estudiante con id = 1 que firmó (está en la matriz de estudiantes) para matemáticas e inglés, entonces la consulta devolverá cursos de matemáticas e inglés.
Intenté esto sin éxito (obteniendo nulo, pero el usuario está en la matriz de objetos de los estudiantes):
router.post("/:id", async (req, res) => { try { // get user var user = await User.findOne({ username: req.body.username, email: req.body.email, password: req.body.password, }); // search user courses by user id. const coursesList = await Course.find({ students: { $in: [{ studentID: user._id, studentName: user.username }], }, }); res.status(200).json(coursesList); } catch (err) { res.status(500).json(err.message); } });Puedes hacerlo así:
const coursesList = await Course.find({ "students.studentID": user._id });Si solo desea devolver el usuario coincidente, puede usar la canalización de agregación. Demostración en vivo aquí
[ { "course": "Math", "students": [ { studentID: "id_1", studentName: "Name 1" }, { studentID: "id_2", studentName: "Name 2" } ] }, { "course": "English", "students": [ { studentID: "id_1", studentName: "Name 1" }, { studentID: "id_3", studentName: "Name 3" } ] }, { "course": "Programming", "students": [ { studentID: "id_4", studentName: "Name 4" }, { studentID: "id_5", studentName: "Name 5" } ] }, ] db.collection.aggregate([ { $unwind: "$students" }, { $match: { "students.studentID": "id_1" } } ]) [ { "_id": ObjectId("5a934e000102030405000000"), "course": "Math", "students": { "studentID": "id_1", "studentName": "Name 1" } }, { "_id": ObjectId("5a934e000102030405000001"), "course": "English", "students": { "studentID": "id_1", "studentName": "Name 1" } } ]