Zoals je misschien al hebt geprobeerd, kun je een specifiek item in een array niet specificeren als een "sleutel" om te "sorteren" met een simpele zoekopdracht. Hiervoor heb je de aggregatiemethode nodig om de sleutels te krijgen waarop je wilt sorteren.
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
}}
])
Dus hier "extraheer" je de overeenkomende waarden met behulp van de $cond
operator binnen een $max
statement na het afwikkelen van de array. De gedenormaliseerde documenten hebben niet allemaal dezelfde waarden als ze nu de items in de array vertegenwoordigen, dus u test ze.
Met die geëxtraheerde sleutels kunt u uw hele documenten opnieuw sorteren en vervolgens die velden verwijderen omdat u ze niet langer nodig hebt.