使用自定义表达式或函数对MongoDB进行排序 [英] MongoDB sort with a custom expression or function
问题描述
我的一个收藏夹是具有某些状态的一系列操作(或任务).例如,文档列表看起来像这样
One of my collections is a list of operations (or tasks) with some status. For example, a list of documents can look like this
{
_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
.
I want to sort this list based on a their status, where new > pending > complete
.
如何在不创建额外字段的情况下使用MongoDB做到这一点?我问的是,在我的情况下,排序顺序可能是预先配置的(例如,用户可以将其偏好设置为pending > new > complete
)
How can I do that with MongoDB without having to create an extra field? I am asking as in my case the sorting order may be pre-configured (i.e. users could have their preferences to pending > new > complete
for example)
推荐答案
基于@chirdam所说的是实现的样子.同样,新排序的字段也不按要求出现在结果中.
Based on what @chirdam said here is what the implementation looks like. Also the new sorted field is not present in the result as requested.
数据集:
{
_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" }
这篇关于使用自定义表达式或函数对MongoDB进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!