Jak jste si již možná vyzkoušeli, nemůžete určit konkrétní položku uvnitř pole jako „klíč“ pro „třídění“ jednoduchým hledáním. K tomu budete potřebovat agregační metodu, abyste získali klíče, podle kterých chcete třídit.
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
}}
])
Zde tedy "extrahujete" odpovídající hodnoty pomocí $cond
operátor v rámci $max
příkaz po rozbalení pole. Denormalizované dokumenty nemají všechny stejné hodnoty, jaké nyní představují položky v poli, takže je otestujete.
Pomocí těchto extrahovaných klíčů můžete znovu třídit celé dokumenty a poté tato pole nakonec zahodit, protože je již nepotřebujete.