Seperti yang mungkin sudah Anda coba, Anda tidak dapat menentukan item tertentu di dalam array sebagai "kunci" untuk "mengurutkan" dengan pencarian sederhana. Untuk ini, Anda akan memerlukan metode agregat untuk mendapatkan kunci yang ingin Anda urutkan.
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
}}
])
Jadi di sini Anda "mengekstrak" nilai yang cocok menggunakan $cond
operator dalam $max
pernyataan setelah melepas array. Dokumen yang dinormalisasi tidak semuanya memiliki nilai yang sama seperti yang sekarang mewakili item dalam larik, jadi Anda mengujinya.
Dengan kunci yang diekstrak tersebut, Anda dapat mengurutkan kembali seluruh dokumen, dan akhirnya membuang kolom tersebut karena tidak lagi diperlukan.