Come potresti aver già provato, non puoi specificare un elemento specifico all'interno di un array come "chiave" per "ordinare" con una semplice ricerca. Per questo avrai bisogno del metodo aggregato per ottenere le chiavi su cui desideri ordinare.
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
}}
])
Quindi qui "estrai" i valori corrispondenti usando $cond
operatore all'interno di un $max
istruzione dopo aver svolto l'array. I documenti denormalizzati non hanno tutti gli stessi valori poiché ora rappresentano gli elementi nell'array, quindi testali.
Con quelle chiavi estratte puoi ordinare di nuovo tutti i tuoi documenti e infine eliminare quei campi poiché non ti servono più.