sql >> Database >  >> NoSQL >> MongoDB

Hoe sorteer ik een verzameling op basis van waarden in een array

Zoals je misschien al hebt geprobeerd, kun je een specifiek item in een array niet specificeren als een "sleutel" om te "sorteren" met een simpele zoekopdracht. Hiervoor heb je de aggregatiemethode nodig om de sleutels te krijgen waarop je wilt sorteren.

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

Dus hier "extraheer" je de overeenkomende waarden met behulp van de $cond operator binnen een $max statement na het afwikkelen van de array. De gedenormaliseerde documenten hebben niet allemaal dezelfde waarden als ze nu de items in de array vertegenwoordigen, dus u test ze.

Met die geëxtraheerde sleutels kunt u uw hele documenten opnieuw sorteren en vervolgens die velden verwijderen omdat u ze niet langer nodig hebt.




  1. MongoDb-besparing veroorzaakt een fout voor privéleden van de PHP-klasse

  2. RSpec laadtijd ongelooflijk lang op OS X

  3. Fatale fout - 'Mongo'-klasse niet gevonden

  4. doRedis met vreemde socketverbindingsfout in Ubuntu Linux, R en RStudio