¿Cómo ordeno una colección basada en valores en una matriz?

Tengo una colección llamada resultado con los siguientes valores:

> db.result.findOne() { "_id" : ObjectId("53b05264421aa97e980ba404"), "result" : [ { "attempted" : 49, "subject_total_marks" : 50, "score" : 15, "correct_subject_answer" : 15, "subject" : "Biology" }, { "attempted" : 30, "subject_total_marks" : 30, "score" : 4, "correct_subject_answer" : 4, "subject" : "Chemistry" }, { "attempted" : 20, "subject_total_marks" : 20, "score" : 7, "correct_subject_answer" : 7, "subject" : "Physics" }, { "attempted" : 99, "correct_subject_answer" : 26, "score" : 26, "subject_total_marks" : 100, "subject" : "Total" } ], "useruid" : NumberLong(548), "exam_code" : 301, "ess_time" : 1404062120 } 

Ahora quiero ordenar la colección según el “puntaje” del “total” que está dentro de la matriz de resultados. Luego, clasifíquelo en base a la puntuación de física, matemáticas y luego a la química y finalmente a la biología.

Como ya ha intentado, no puede especificar un elemento específico dentro de una matriz como una “clave” para “ordenar” con un simple hallazgo. Para ello, necesitará el método agregado para obtener las claves que desea ordenar.

 db.exam.aggregate([ # Unwind to de-normalize { "$unwind": "$result" }, # Group back to the document and extract each score { "$group": { "_id": "$_id", "result": { "$push": "$result" }, "useruid": { "$first": "$useruid" }, "exam_code": { "$first": "$exam_code" }, "ess_time": { "$first": "$ess_time" }, "Total": { "$max": { "$cond": [ { "$eq": [ "$result.subject", "Total" ] }, "$result.score", 0 ] } }, "Physics": { "$max": { "$cond": [ { "$eq": [ "$result.subject", "Physics" ] }, "$result.score", 0 ] } }, "Mathematics": { "$max": { "$cond": [ { "$eq": [ "$result.subject", "Mathematics" ] }, "$result.score", 0 ] } }, "Chemistry": { "$max": { "$cond": [ { "$eq": [ "$result.subject", "Chemistry" ] }, "$result.score", 0 ] } }, "Biology": { "$max": { "$cond": [ { "$eq": [ "$result.subject", "Biology" ] }, "$result.score", 0 ] } } }}, # Sort on those scores { "$sort": { "Total": -1, "Physics": -1, "Mathematics": -1, "Chemistry": -1, "Biology": -1 }}, # Project final wanted fields { "$project": { "result": 1, "useruid": 1, "exam_code": 1, "ess_time": 1 }} ]) 

Así que aquí “extrae” los valores coincidentes utilizando el operador $cond dentro de una statement $max después de desenrollar la matriz. No todos los documentos normalizados tienen los mismos valores, ya que ahora representan los elementos de la matriz, por lo que los prueba.

Con esas claves extraídas, puede ordenar nuevamente todos sus documentos y finalmente descartar esos campos ya que ya no los necesita.