MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment trier une collection en fonction des valeurs d'un tableau

Comme vous l'avez peut-être déjà essayé, vous ne pouvez pas spécifier un élément spécifique dans un tableau en tant que "clé" pour "trier" avec une simple recherche. Pour cela, vous aurez besoin de la méthode d'agrégation afin d'obtenir les clés sur lesquelles vous souhaitez trier.

db.exam.aggregate([

     # Unwind to de-normalize
     { "$unwind": "$result" },

     # Group back to the document and extract each score
     { "$group": {
         "_id": "$_id",
         "result": { "$push": "$result" },
         "useruid": { "$first": "$useruid" },
         "exam_code": { "$first": "$exam_code" },
         "ess_time": { "$first": "$ess_time" },
         "Total": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Total" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Physics": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Physics" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Mathematics": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Mathematics" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Chemistry": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Chemistry" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Biology": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Biology" ] },
                     "$result.score",
                     0
                 ]
             }
         }
     }},

     # Sort on those scores
     { "$sort": {
         "Total": -1,
         "Physics": -1,
         "Mathematics": -1,
         "Chemistry": -1,
         "Biology": -1
     }},

     # Project final wanted fields
     { "$project": {
         "result": 1,
         "useruid": 1,
         "exam_code": 1,
         "ess_time": 1
     }}
])

Donc ici, vous "extrayez" les valeurs correspondantes en utilisant le $cond opérateur dans un $max instruction après avoir déroulé le tableau. Les documents dénormalisés n'ont pas tous les mêmes valeurs car ils représentent maintenant les éléments du tableau, vous les testez donc.

Avec ces clés extraites, vous pouvez trier à nouveau l'ensemble de vos documents, puis supprimer ces champs car vous n'en avez plus besoin.