sql >> Databáze >  >> NoSQL >> MongoDB

Jak třídím kolekci na základě hodnot v poli

Jak jste si již možná vyzkoušeli, nemůžete určit konkrétní položku uvnitř pole jako „klíč“ pro „třídění“ jednoduchým hledáním. K tomu budete potřebovat agregační metodu, abyste získali klíče, podle kterých chcete třídit.

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

Zde tedy "extrahujete" odpovídající hodnoty pomocí $cond operátor v rámci $max příkaz po rozbalení pole. Denormalizované dokumenty nemají všechny stejné hodnoty, jaké nyní představují položky v poli, takže je otestujete.

Pomocí těchto extrahovaných klíčů můžete znovu třídit celé dokumenty a poté tato pole nakonec zahodit, protože je již nepotřebujete.




  1. Jak přimět aplikace meteor.com používat externí mongo db

  2. agregace mongodb při aktualizaci kolekcí

  3. Sdružování databázových připojení ovladače MongoDB Java Driver s Tomcat

  4. Průměrná agregace s časovým razítkem řetězce