Anda perlu $project
sebuah "bobot" untuk setiap nilai secara berurutan dalam istilah MongoDB, dan itu berarti .aggregate()
metode:
db.users.aggregate([
{ "$project": {
"status": 1,
"a_field": 1,
"another_field": 1,
"pretty_much_every_field": 1,
"weight": {
"$cond": [
{ "$eq": [ "$status", "A" ] },
10,
{ "$cond": [
{ "$eq": [ "$status", "B" ] },
8,
{ "$cond": [
{ "$eq": [ "$status", "C" ] },
6,
{ "$cond": [
{ "$eq": [ "$status", "D" ] },
4,
0
]}
]}
]}
]
}
}},
{ "$sort": { "weight": -1 } }
])
Penggunaan bersarang dari $cond
. ternary memungkinkan setiap item untuk "status" dianggap sebagai nilai "bobot" berurutan dalam urutan argumen yang diberikan.
Ini pada gilirannya diumpankan ke $sort
, di mana nilai yang diproyeksikan ( "bobot" ) digunakan untuk mengurutkan hasil yang diberi skor oleh pencocokan berbobot.
Jadi dengan cara ini preferensi diberikan pada urutan kecocokan "status" yang muncul pertama kali dalam hasil yang diurutkan.