Isso como um conceito geral é chamado de "ponderação". Portanto, sem nenhum outro mecanismo em vigor, você lida com isso logicamente em uma consulta do MongoDB "projetando" os valores para o "peso" no documento logicamente.
Seu método para "projetar" e alterar os campos presentes em seu documento é o
.aggregate()
e especificamente é $project
estágio do encanamento:db.collection.aggregate([
{ "$project": {
"getthisfirst": 1,
"weight": {
"$cond": [
{ "$eq": [ "$getthisfirst", "yes" ] },
10,
{ "$cond": [
{ "$eq": [ "$getthisfirst", "maybe" ] },
5,
0
]}
]
}
}},
{ "$sort": { "weight": -1 } }
]);
O
$cond
operador aqui é um "ternary"
( if/then/else ) condição onde o primeiro argumento é uma declaração condicional que chega ao booleano true|false
. Se true
"then" o segundo argumento é retornado como resultado, caso contrário, o "else" ou o terceiro argumento são retornados em resposta. Neste caso "aninhado", então onde o "sim" é uma correspondência, uma certa pontuação de "peso" é atribuída, caso contrário, passamos para o próximo teste de condição, onde quando "talvez" é uma correspondência, outra pontuação é atribuída, ou caso contrário, a pontuação é
0
já que só temos três possibilidades para combinar. Em seguida, o
$sort
A condição é aplicada para bem "ordenar" (em ordem decrescente) os resultados com o maior "peso" no topo.