如何在MongoDB中执行基于值的Order By?

Pra*_*iya 6 mongodb mongodb-query aggregation-framework

select * from users ORDER BY FIELD(status, 'A', 'B', 'C', 'D') ASC; 
Run Code Online (Sandbox Code Playgroud)

这将根据所有用户的状态对所有用户进行排序,以便所有状态为"A"的用户先来"B",依此类推.MongoDB中的等价物是什么?

Bla*_*ven 5

$project在MongoDB术语中,您需要按顺序为每个值"加权",这意味着.aggregate()方法:

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 } }
])
Run Code Online (Sandbox Code Playgroud)

嵌套使用三元组 $cond允许"状态"的每个项目按照给定参数的顺序被视为有序"权重"值.

这反过来被馈送到$sort,其中投影值("权重")用于按加权匹配对得分进行排序.

因此,通过这种方式,优先考虑"状态"匹配的顺序,其首先出现在排序结果中.


小智 0

排序 ASC -> 状态:1

db.users.find().sort( { status: 1 } )
Run Code Online (Sandbox Code Playgroud)

对 DESC 进行排序 -> 状态:-1

db.users.find().sort( { status: -1 } )
Run Code Online (Sandbox Code Playgroud)