Como ya habrá intentado, no puede especificar un elemento específico dentro de una matriz como una "clave" para "ordenar" con una simple búsqueda. Para esto, necesitará el método agregado para obtener las claves que desea clasificar.
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í "extraes" los valores coincidentes usando el $cond
operador dentro de un $max
declaración después de desenredar la matriz. No todos los documentos desnormalizados tienen los mismos valores, ya que ahora representan los elementos de la matriz, así que pruébelos.
Con esas claves extraídas, puede volver a ordenar todos sus documentos y, finalmente, descartar esos campos porque ya no los necesita.