MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como executar um Order By baseado em valor no MongoDB?


Você precisa $project um "peso" para cada valor em ordem nos termos do MongoDB, e isso significa que o .aggregate() método:
db.users.aggregate([
    { "$project": {
        "status": 1,
        "a_field": 1,
        "another_field": 1,
        "pretty_much_every_field": 1,
        "weight": {
            "$cond": [
                { "$eq": [ "$status", "A" ] },
                10,
                { "$cond": [ 
                    { "$eq": [ "$status", "B" ] },
                    8,
                    { "$cond": [
                        { "$eq": [ "$status", "C" ] },
                        6,
                        { "$cond": [
                            { "$eq": [ "$status", "D" ] },
                            4,
                            0
                        ]}
                    ]}
                ]}
            ] 
        }
    }},
    { "$sort": { "weight": -1 } }
])

O uso aninhado do ternário $cond permite que cada item de "status" seja considerado como um valor de "peso" ordenado na ordem dos argumentos fornecidos.

Isso, por sua vez, é alimentado em $sort , onde o valor projetado ( "weight" ) é usado para classificar os resultados conforme pontuado pela correspondência ponderada.

Dessa forma, a preferência é dada à ordem das correspondências de "status" de acordo com o que aparece primeiro nos resultados classificados.