MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment effectuer un Order By basé sur la valeur dans MongoDB ?

Vous devez $project un "poids" pour chaque valeur dans l'ordre en termes MongoDB, et cela signifie le .aggregate() méthode :

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 } }
])

L'utilisation imbriquée du ternaire $cond permet à chaque élément de "statut" d'être considéré comme une valeur de "poids" ordonnée dans l'ordre des arguments donnés.

Ceci est à son tour envoyé à $sort , où la valeur projetée ("pondération" ) est utilisée pour trier les résultats tels qu'ils sont notés par la correspondance pondérée.

Ainsi, de cette manière, la préférence est donnée à l'ordre des correspondances "de statut" quant à celle qui apparaît en premier dans les résultats triés.