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

这将根据所有用户的状态对所有用户进行排序,以便所有状态为“A”的用户将首先出现,然后是“B”,依此类推。 MongoDB中的等效物是什么?

最佳答案

您需要按MongoDB术语的顺序为每个值 $project 指定一个“权重”,这意味着 .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 允许将“状态”的每个项目按照给定参数的顺序视为有序的“权重”值。

这又被馈送到 $sort ,其中投影值(“weight”)用于对加权匹配所计分的结果进行排序。

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

09-26 01:52