MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak posortować kolekcję na podstawie wartości w tablicy?

Jak być może już próbowałeś, nie możesz określić określonego elementu w tablicy jako „klucza” do „sortowania” za pomocą prostego wyszukiwania. W tym celu będziesz potrzebować metody agregującej, aby uzyskać klucze, według których chcesz sortować.

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

Tak więc tutaj „wyodrębniasz” pasujące wartości za pomocą $cond operator w $max instrukcja po rozwinięciu tablicy. Nie wszystkie zdenormalizowane dokumenty mają te same wartości, które reprezentują teraz elementy w tablicy, więc je testujesz.

Za pomocą tych wyodrębnionych kluczy możesz ponownie posortować całe dokumenty, a następnie odrzucić te pola, ponieważ już ich nie potrzebujesz.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mając listę identyfikatorów, jaki jest najlepszy sposób na sprawdzenie, które identyfikatory nie istnieją w kolekcji?

  2. BadValue Nieprawidłowa lub nie ustawiono ustawień regionalnych użytkownika. Upewnij się, że zmienne środowiskowe LANG i/lub LC_* są ustawione poprawnie

  3. Aktualizacja zagnieżdżonego rekordu w tablicy mongodb, gdy nie znasz indeksu dokumentu

  4. Używanie agregacji Mongo do obliczania sumy wartości

  5. MongoDB $inc