Tengo un sistema de calificación de estudiantes que utiliza MongoDB. Tengo los siguientes documentos en MongoDB:
¿Cómo obtengo el número de estudiantes que obtuvieron grade "A","B","C","D" para una subject en particular? El "_id" para cada sujeto sigue siendo el mismo.
{ _id: "60b223541338467beaf3ae0d", studentName: "John Doe" studentGradingDetails: [ { _id: "60b21e47e5462929cab27a98", term: "semester-1", subject: "chemistry", grade: "A", createdAt: "2021-05-29T10:58:15.113Z", }, { _id: "60b21e47e5462929cab27a99", term: "semester-2", subject: "computer_science", grade: "B", createdAt: "2021-05-29T10:58:15.113Z", }, ], createdAt: "2021-05-29T11:19:48.770Z", } { _id: "60b223541338467beaf3ae0e", studentName: "Will Smith" studentGradingDetails: [ { _id: "60b21e47e5462929cab27a98", term: "semester-1", subject: "chemistry", grade: "D", createdAt: "2021-05-29T10:58:15.113Z", }, { _id: "60b21e47e5462929cab27a99", term: "semester-2", subject: "computer_science", grade: "A", createdAt: "2021-05-29T10:58:15.113Z", }, ], createdAt: "2021-05-29T11:19:48.770Z", }Esto es lo que probé y me quedé, ¿no estoy seguro de cuáles son los siguientes pasos?
await db.collection("studentsemestergrades") .aggregate([ { $unwind: "$studentGradingDetails" }, { $group: { _id: "$studentGradingDetails._id", }, }, ]) .toArray();Rendimiento esperado:
Distribución de alumnos con diferentes notas en cada materia (_id )
{ "_id" : "60b21e47e5462929cab27a98", "A" : 12, "B" : 20, "C" : 8, "D" : 2 }, { "_id" : "60b21e47e5462929cab27a99", "A" : 5, "B" : 2, "C" : 8, "D" : 12 }$unwind deconstruye la matriz studentGradingDetails$group por _id y grade y obtener el recuento total$group solo por _id y construir la matriz de pares clave-valor del objeto con grade y count$arrayToObject convierte la matriz de par clave-valor anterior en objeto$mergeObjects para fusionar el objeto convertido y el campo _id , puede agregar más campos si es necesario$replaceRoot para reemplazar el objeto de combinación anterior a la raíz await db.collection("studentsemestergrades").aggregate([ { $unwind: "$studentGradingDetails" }, { $group: { _id: { _id: "$studentGradingDetails._id", grade: "$studentGradingDetails.grade" }, count: { $sum: 1 } } }, { $group: { _id: "$_id._id", grades: { $push: { k: "$_id.grade", v: "$count" } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ { _id: "$_id" }, { $arrayToObject: "$grades" } ] } } } ])