Như bạn có thể đã thử, bạn không thể chỉ định một mục cụ thể bên trong một mảng làm "khóa" để "sắp xếp" với một tìm kiếm đơn giản. Đối với điều này, bạn sẽ cần phương pháp tổng hợp để có được các khóa bạn muốn sắp xế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
}}
])
Vì vậy, ở đây bạn "trích xuất" các giá trị phù hợp bằng cách sử dụng mã <> $ cond
toán tử trong $ max
câu lệnh sau khi giải nén mảng. Các tài liệu không chuẩn hóa không phải tất cả đều có cùng giá trị như bây giờ chúng đại diện cho các mục trong mảng, vì vậy bạn hãy kiểm tra chúng.
Với các khóa được trích xuất đó, bạn có thể sắp xếp lại toàn bộ tài liệu của mình và cuối cùng loại bỏ các trường đó khi bạn không cần nữa.