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”)用于对加权匹配所计分的结果进行排序。因此,通过这种方式,优先考虑“状态”匹配的顺序,该顺序首先出现在排序结果中。