Você precisa
$project
um "peso" para cada valor em ordem nos termos do MongoDB, e isso significa que o .aggregate()
método: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 } }
])
O uso aninhado do ternário
$cond
permite que cada item de "status" seja considerado como um valor de "peso" ordenado na ordem dos argumentos fornecidos. Isso, por sua vez, é alimentado em
$sort
, onde o valor projetado ( "weight" ) é usado para classificar os resultados conforme pontuado pela correspondência ponderada. Dessa forma, a preferência é dada à ordem das correspondências de "status" de acordo com o que aparece primeiro nos resultados classificados.