Ce concept général est appelé "pondération". Donc, sans aucun autre mécanisme en place, vous gérez cela logiquement dans une requête MongoDB en "projetant" logiquement les valeurs du "poids" dans le document.
Votre méthode pour "projeter" et modifier les champs présents dans votre document est le .aggregate()
méthode, et plus précisément c'est $project
étape du pipeline :
db.collection.aggregate([
{ "$project": {
"getthisfirst": 1,
"weight": {
"$cond": [
{ "$eq": [ "$getthisfirst", "yes" ] },
10,
{ "$cond": [
{ "$eq": [ "$getthisfirst", "maybe" ] },
5,
0
]}
]
}
}},
{ "$sort": { "weight": -1 } }
]);
Le $cond
l'opérateur ici est un "ternaire"
( if/then/else ) condition où le premier argument est une instruction conditionnelle arrivant au booléen true|false
. Si true
"then" le deuxième argument est renvoyé comme résultat, sinon le "else" ou le troisième argument est renvoyé en réponse.
Dans ce cas "imbriqué", alors où le "oui" est une correspondance, un certain score de "poids" est attribué, sinon nous passons au test de condition suivant où lorsque "peut-être" est une correspondance, un autre score est attribué, ou sinon le score est 0
puisque nous n'avons que trois possibilités pour faire correspondre.
Puis le $sort
condition est appliquée afin de bien "ordonner" (par ordre décroissant) les résultats avec le plus grand "poids" en haut.