【发布时间】:2015-11-19 22:52:33
【问题描述】:
select * from users ORDER BY FIELD(status, 'A', 'B', 'C', 'D') ASC;
这将根据用户的状态对所有用户进行排序,所有状态为“A”的用户将首先出现,然后是“B”,依此类推。 MongoDB 中的等价物是什么?
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework
select * from users ORDER BY FIELD(status, 'A', 'B', 'C', 'D') ASC;
这将根据用户的状态对所有用户进行排序,所有状态为“A”的用户将首先出现,然后是“B”,依此类推。 MongoDB 中的等价物是什么?
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework
您需要为每个值在 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,其中投影值(“权重”)用于根据加权匹配对结果进行排序。
因此,通过这种方式,优先考虑“状态”匹配的顺序,即首先出现在排序结果中。
【讨论】:
排序 ASC -> 状态:1
db.users.find().sort( { status: 1 } )
对 DESC 进行排序 -> 状态:-1
db.users.find().sort( { status: -1 } )
【讨论】: