Пользовательская сортировка MongoDB с несколькими парами ключ-значение - PullRequest
2 голосов
/ 05 августа 2020

Список документов в коллекции: -

{ _id: '1', task: 'task1', status: 'pending', dayAged: '3' },
{ _id: '2', task: 'task2', status: 'waiting', dayAged: '1' },
{ _id: '3', task: 'task3', status: 'complete', dayAged: '3' }
{ _id: '4', task: 'task4', status: 'waiting', dayAged: '3' },
{ _id: '5', task: 'task5', status: 'pending', dayAged: '2' },
{ _id: '6', task: 'task6', status: 'pending', dayAged: '1' },

Как мы можем отсортировать приведенные выше данные на основе статуса и возраста, который должен быть, если статус ожидает, то в соответствии с днем ​​возраста этого статуса должен быть перечисленные например: - статус ожидание должно быть первым, затем dayAged после этого pending затем dayAged , чтобы я мог отсортировать dayAged по возрастанию и убыванию.

{ _id: '4', task: 'task4', status: 'waiting', dayAged: '3' },
{ _id: '2', task: 'task2', status: 'waiting', dayAged: '1' }, 
{ _id: '1', task: 'task1', status: 'pending', dayAged: '3' },
{ _id: '5', task: 'task5', status: 'pending', dayAged: '2' },
{ _id: '6', task: 'task6', status: 'pending', dayAged: '1' },    
{ _id: '3', task: 'task3', status: 'complete', dayAged: '3' }

Результат должен быть таким ..

pend.  3
pend.  2
pend.  1 
wait.  23
wait.  21
wait.  13
done.  8
done.  6
done.  3

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете использовать $ addFields вместе с $ switch , чтобы назначить «вес» для каждого статуса. Как только это будет сделано, вы можете $ sort по этому новому полю и затем удалить его, используя $ project :

db.collection.aggregate([
    {
        $addFields: {
            statusWeight: {
                $switch: {
                    branches: [
                        { case: { $eq: [ "$status", "waiting" ] }, then: 0 },
                        { case: { $eq: [ "$status", "pending" ] }, then: 1 }
                    ],
                    default: 2
                }
            }
        }
    },
    {
        $sort: {
            statusWeight: 1,
            dayAged: -1
        }
    },
    {
        $project: {
            statusWeight: 0
        }
    }
])

Mon go Playground

...