Ok, esto podría ser un desastre.
Recientemente aprendí Javascript y Firebase y tengo este proyecto para la escuela en la que estoy trabajando actualmente donde los estudiantes pueden hacer exámenes en un sitio web. Las claves de respuesta para el examen se almacenan en Firebase Firestore en una colección denominada "answerkeys".
Uso Javascript para cambiar las ID de documentos en esta colección de "claves de respuesta" para que cada ID de documento se llame así:
collection /answerkey/ math01 { answerKey : a, subject : math, questionNum : 01, score: 5 }, math02 { answerKey : b, subject : math, questionNum : 02, score: 15 }, ...., science01 { answerKey : b, subject : science, questionNum : 02, score: 10 }, science02 { answerKey : c, subject : science, questionNum : 02, score: 20 }Entonces, el ID del documento math01 representa el tema: matemáticas y el número de pregunta: 01.
Yo uso subject: math para consultar, así que cada vez que se trata de un examen de matemáticas, simplemente lo consulto de esta manera:
query(collection(db, "exam"), where("category", "==", "math")Cuando los estudiantes envían su respuesta, se almacena así en su perfil de usuario:
collection /users/ userID (generated by firebase) { firstName : Jeff, lastName : Kalimba, subject1 : math, subject2 : science, subject3 : english answer : { math01: a, math02: b, ..., science01: c, science02: a, ..., english01: e, english02: b, ... } }Y ahora estoy absolutamente confundido sobre cómo hacer la calificación. ¿Cómo debo abordar este problema si el requisito es mostrar, digamos de 1.000 estudiantes, nombrar el 25% superior?
Ni siquiera estoy seguro ahora si hice la estructura de datos correcta. Y ahora la cantidad de datos de estudiantes en realidad es de 1.000 estudiantes. Por lo tanto, rehacer la estructura de datos llevará bastante tiempo. Si es posible, me gustaría evitar eso.
Lo que tengo en mente ahora es consultar todos los nombres donde el sujeto 1 = matemáticas. Esto no será eficiente en absoluto porque algunos estudiantes tienen materia 2 = matemáticas (porque al principio pensé erróneamente que el orden no es importante). Pero es lo que tengo actualmente. Entonces, ¿hay una manera eficiente de llegar a la calificación y luego al 25% superior?
No necesito que las respuestas y sugerencias estén en forma de código JS, pero ¿cuáles son los pasos correctos para abordar este problema? No sé qué hacer a continuación, ¿qué debo hacer primero? ¿O podría señalar que debería haber hecho la estructura de esta manera o de esa manera en lugar de lo que es actualmente?
Copio de los comentarios de arriba:
Puede calcular la puntuación de cada estudiante y almacenarla en la colección de users en un nuevo campo de score . Ahora puede simplemente consultar los N documentos principales ordenándolos en el nuevo campo de score .