sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur sorterar jag en samling baserat på värden i en array

Som du kanske redan har försökt kan du inte ange ett specifikt objekt i en array som en "nyckel" för att "sortera" med ett enkelt fynd. För detta kommer du att behöva den aggregerade metoden för att få nycklarna du vill sortera på.

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å här "extraherar" du de matchande värdena med $cond operatör inom en $max uttalande efter att ha avvecklat arrayen. De avnormaliserade dokumenten har inte alla samma värden eftersom de nu representerar objekten i arrayen, så du testar dem.

Med de extraherade nycklarna kan du sortera hela dina dokument igen och sedan slutligen kassera dessa fält eftersom du inte längre behöver dem.




  1. Vad kan göras med Mongo Aggregation / Performance of Mongo Aggregation

  2. Sailsjs - Custom Logging med Winston

  3. MEAN Stack:Hur uppdaterar man en funktions resultat till databasen?

  4. kan inte dela':dålig URI(är inte URI?):