Questo come concetto generale è chiamato "ponderazione". Quindi, senza alcun altro meccanismo in atto, lo gestisci logicamente in una query MongoDB "proiettando" i valori per il "peso" nel documento in modo logico.
Il tuo metodo per "proiettare" e modificare i campi presenti nel tuo documento è il .aggregate()
metodo, e in particolare è $project
fase della pipeline:
db.collection.aggregate([
{ "$project": {
"getthisfirst": 1,
"weight": {
"$cond": [
{ "$eq": [ "$getthisfirst", "yes" ] },
10,
{ "$cond": [
{ "$eq": [ "$getthisfirst", "maybe" ] },
5,
0
]}
]
}
}},
{ "$sort": { "weight": -1 } }
]);
Il $cond
operatore qui è un "ternario"
( if/then/else ) condizione in cui il primo argomento è un'istruzione condizionale che arriva a booleano true|false
. Se true
"quindi" viene restituito il secondo argomento come risultato, altrimenti viene restituito "else" o il terzo argomento in risposta.
In questo caso "nidificato", quindi dove il "sì" è una corrispondenza viene assegnato un certo punteggio di "peso", altrimenti si passa al test di condizione successivo in cui quando "forse" è una corrispondenza viene assegnato un altro punteggio, oppure altrimenti il punteggio è 0
poiché abbiamo solo tre possibilità da abbinare.
Quindi $sort
viene applicata la condizione per, bene "ordinare" (in ordine decrescente) i risultati con il "peso" più grande in cima.