我的一个集合是一个具有某种状态的操作(或任务)列表。例如,文档列表可能如下所示
{
_id: '57befe57fc956d2e3252890c',
task: 'Go buy milk',
status: 'pending'
},
{
_id: '57befe5efc956d2e3252890d',
task: 'Cook dinner',
status: 'complete'
},
{
_id: '57befe5efc956d2e3252890e',
task: 'Play games',
status: 'new'
}
我想根据其状态对此列表进行排序,其中new > pending > complete
。
如何在不创建额外字段的情况下使用MongoDB进行此操作?我问的是,在我的情况下,可以预先配置排序顺序(例如,用户可以将他们的偏好设置为pending > new > complete
)
答案 0 :(得分:6)
基于@chirdam所说的实现是什么样的。此外,新的排序字段不会按要求出现在结果中。
数据集:
{
_id: '57befe57fc956d2e3252890c',
task: 'Go buy milk',
status: 'pending'
},
{
_id: '57befe5efc956d2e3252890d',
task: 'Cook dinner',
status: 'complete'
},
{
_id: '57befe5efc956d2e3252890e',
task: 'Play games',
status: 'new'
}
查询:
db.task.aggregate([
{ "$project" : {
"_id" : 1,
"task" : 1,
"status" : 1,
"order" : {
"$cond" : {
if : { "$eq" : ["$status", "new"] }, then : 1,
else : { "$cond" : {
"if" : { "$eq" : ["$status", "pending"] }, then : 2,
else : 3
}
}
}
}
} },
{"$sort" : {"order" : 1} },
{ "$project" : { "_id" : 1, "task" : 1, "status" : 1 } }
])
<强>输出:强>
{ "_id" : "57befe5efc956d2e3252890e", "task" : "Play games", "status" : "new" }
{ "_id" : "57befe57fc956d2e3252890c", "task" : "Go buy milk", "status" : "pending" }
{ "_id" : "57befe5efc956d2e3252890d", "task" : "Cook dinner", "status" : "complete" }