Som du kanske redan har försökt kan du inte ange ett specifikt objekt i en array som en "nyckel" för att "sortera" med ett enkelt fynd. För detta kommer du att behöva den aggregerade metoden för att få nycklarna du vill sortera på.
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
}}
])
Så här "extraherar" du de matchande värdena med $max
uttalande efter att ha avvecklat arrayen. De avnormaliserade dokumenten har inte alla samma värden eftersom de nu representerar objekten i arrayen, så du testar dem.
Med de extraherade nycklarna kan du sortera hela dina dokument igen och sedan slutligen kassera dessa fält eftersom du inte längre behöver dem.