Подтвердить что ты не робот

MongoDB сортировать с помощью специального выражения или функции

Одна из моих коллекций - это список операций (или задач) с некоторым статусом. Например, список документов может выглядеть следующим образом:

{
  _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, например)

4b9b3361

Ответ 1

Основываясь на том, что сказал @chirdam, вот что выглядит реализация. Также новое отсортированное поле отсутствует в запросе.

DataSet:

{
  _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" }