MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie sortiere ich eine Sammlung basierend auf Werten in einem Array?

Wie Sie vielleicht schon versucht haben, können Sie ein bestimmtes Element innerhalb eines Arrays nicht als "Schlüssel" zum "Sortieren" mit einer einfachen Suche angeben. Dazu benötigen Sie die Aggregat-Methode, um die Schlüssel zu erhalten, nach denen Sie sortieren möchten.

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

Hier "extrahieren" Sie also die übereinstimmenden Werte mit dem Code <>$cond Operator innerhalb eines $max -Anweisung nach dem Entladen des Arrays. Die denormalisierten Dokumente haben nicht alle die gleichen Werte, da sie jetzt die Elemente im Array darstellen, also testen Sie sie.

Mit diesen extrahierten Schlüsseln können Sie Ihre gesamten Dokumente erneut sortieren und diese Felder dann endgültig verwerfen, da Sie sie nicht mehr benötigen.