sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan sorterer jeg en samling baseret på værdier i en matrix

Som du måske allerede har prøvet, kan du ikke angive et specifikt element inde i et array som en "nøgle" til at "sortere" med et simpelt fund. Til dette skal du bruge den samlede metode for at få de nøgler, du vil sortere efter.

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

Så her "udtrækker" du de matchende værdier ved hjælp af $cond operatør inden for en $max sætning efter afvikling af arrayet. De denormaliserede dokumenter har ikke alle de samme værdier, da de nu repræsenterer elementerne i arrayet, så du tester dem.

Med de udpakkede nøgler kan du sortere hele dine dokumenter igen og til sidst kassere disse felter, da du ikke længere har brug for dem.




  1. Mongoose Mongodb forespørger på en række objekter

  2. Parse migration til heroku/aws vedrørende billedet

  3. Sådan læser du flere sæt gemt på Redis ved hjælp af en kommando eller et LUA-script

  4. Hvordan kan jeg stoppe redis-serveren?