Detta som ett allmänt begrepp kallas "viktning". Så utan någon annan mekanism på plats hanterar du detta logiskt i en MongoDB-fråga genom att "projicera" värdena för "vikten" logiskt in i dokumentet.
Din metod för att "projicera" och ändra fälten i ditt dokument är .aggregate()
metod, och specifikt är det $project
pipeline skede:
db.collection.aggregate([
{ "$project": {
"getthisfirst": 1,
"weight": {
"$cond": [
{ "$eq": [ "$getthisfirst", "yes" ] },
10,
{ "$cond": [
{ "$eq": [ "$getthisfirst", "maybe" ] },
5,
0
]}
]
}
}},
{ "$sort": { "weight": -1 } }
]);
$cond
operatör här är en "ternär"
( if/then/else ) villkor där det första argumentet är ett villkorligt påstående som kommer till booleskt true|false
. Om true
"då" returneras det andra argumentet som resultat, annars returneras "annat" eller det tredje argumentet som svar.
I detta "kapslade" fall, då "ja" är en matchning då tilldelas en viss "vikt"-poäng, annars går vi vidare till nästa tillståndstest där när "kanske" är en matchning så tilldelas en annan poäng, eller annars är poängen 0
eftersom vi bara har tre möjligheter att matcha.
Sedan $sort
villkor tillämpas för att väl "ordna" ( i fallande ordning ) resultaten med den största "vikten" överst.