2 votes

Tri personnalisé MongoDB avec plusieurs paires clé-valeur

Liste des documents d'une collection :-

{ _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' },

Comment trier les données ci-dessus en fonction du statut et de l'âge du jour ? Si le statut est en attente, la liste doit être établie en fonction de l'ancienneté de ce statut.
statut attente devrait être le premier, puis jourAge après cela en attente puis jourAge pour que je puisse trier par ordre croissant ou décroissant le nombre de jours d'âge.

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

Le résultat devrait être le suivant.

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

0voto

mickl Points 8755

Vous pouvez utiliser $addFields ainsi que $switch pour attribuer un "poids" à chaque statut. Une fois que c'est fait, vous pouvez trier par ce nouveau champ et le supprimer ensuite en utilisant $projet :

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
        }
    }
])

Terrain de jeux Mongo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X