Esto como un concepto general se llama "ponderación". Entonces, sin ningún otro mecanismo implementado, maneja esto lógicamente en una consulta MongoDB al "proyectar" los valores para el "peso" en el documento lógicamente.
Su método para "proyectar" y modificar los campos presentes en su documento es .aggregate()
y específicamente es $project
etapa de canalización:
db.collection.aggregate([
{ "$project": {
"getthisfirst": 1,
"weight": {
"$cond": [
{ "$eq": [ "$getthisfirst", "yes" ] },
10,
{ "$cond": [
{ "$eq": [ "$getthisfirst", "maybe" ] },
5,
0
]}
]
}
}},
{ "$sort": { "weight": -1 } }
]);
El $cond
operador aquí es un "ternary"
( if/then/else ) condición donde el primer argumento es una declaración condicional que llega a booleano true|false
. Si true
"entonces" se devuelve el segundo argumento como resultado; de lo contrario, se devuelve el "si no" o el tercer argumento como respuesta.
En este caso "anidado", donde el "sí" es una coincidencia, se asigna una cierta puntuación de "peso", de lo contrario, pasamos a la siguiente prueba de condición donde cuando "tal vez" es una coincidencia, se asigna otra puntuación, o de lo contrario, la puntuación es 0
ya que solo tenemos tres posibilidades para emparejar.
Entonces el $sort
La condición se aplica para "ordenar" (en orden descendente) los resultados con el mayor "peso" en la parte superior.