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

时间:2015-10-09 11:34:39

标签: mongodb mongodb-query aggregation-framework

select * from users ORDER BY FIELD(status, 'A', 'B', 'C', 'D') ASC; 

这将根据所有用户的状态对所有用户进行排序,以便所有具有状态' A'会先来,然后' B'等等。 MongoDB中的等价物是什么?

2 个答案:

答案 0 :(得分: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 } }
])

ternary $cond的嵌套使用允许每个项目为" status"被视为有序"重量"按给定参数的顺序赋值。

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

因此,以这种方式优先考虑" status"的顺序。与排序结果中首先出现的匹配。

答案 1 :(得分:0)

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

db.users.find().sort( { status: 1 } )

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

db.users.find().sort( { status: -1 } )