जैसा कि आप पहले ही कोशिश कर चुके हैं, आप एक साधारण खोज के साथ "कुंजी" से "क्रमबद्ध" के रूप में एक सरणी के अंदर एक विशिष्ट आइटम निर्दिष्ट नहीं कर सकते हैं। इसके लिए आपको उन कुंजियों को प्राप्त करने के लिए समग्र विधि की आवश्यकता होगी, जिन्हें आप सॉर्ट करना चाहते हैं।
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
}}
])
तो यहाँ आप $cond
एक $max
के भीतर ऑपरेटर
सरणी को खोलने के बाद कथन। डी-सामान्यीकृत दस्तावेज़ों में सभी समान मान नहीं होते हैं क्योंकि वे अब सरणी में आइटम का प्रतिनिधित्व करते हैं, इसलिए आप उनका परीक्षण करते हैं।
उन निकाली गई कुंजियों से आप अपने पूरे दस्तावेज़ों को फिर से क्रमित कर सकते हैं, और फिर अंत में उन फ़ील्ड को त्याग सकते हैं क्योंकि अब आपको उनकी आवश्यकता नहीं है।