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

uzyskaj wszystkie dokumenty o maksymalnej wartości za pomocą agregacji w mongodb

Jeśli chcesz zachować informacje o dokumencie, zasadniczo musisz $push go w tablicę. Ale oczywiście, wtedy masz swój $max wartości, musisz filtrować zawartość tablicy tylko dla pasujących elementów:

db.coll.aggregate([
    { "$group":{ 
        "_id": "$country",
        "maxQuantity": { "$max": "$quantity" },
        "docs": { "$push": {
            "_id": "$_id",
            "name": "$name",
            "quantity": "$quantity"
        }}
    }},
    { "$project": {
        "maxQuantity": 1,
        "docs": {
            "$setDifference": [
               { "$map": {
                   "input": "$docs",
                   "as": "doc",
                   "in": {
                       "$cond": [ 
                           { "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
                           "$$doc",
                           false
                       ]
                   }
               }},
               [false]
            ]
        }
    }}
])

Więc przechowujesz wszystko w tablicy, a następnie testujesz każdy element tablicy, aby sprawdzić, czy jego wartość odpowiada tej, która została zarejestrowana jako maksymalna, odrzucając te, które nie pasują.

Zachowałbym _id wartości w dokumentach tablicowych, ponieważ to sprawia, że ​​są one „unikalne” i nie będą miały na nie negatywnego wpływu $setDifference podczas filtrowania wartości. Ale oczywiście, jeśli "nazwa" jest zawsze unikalna, nie będzie wymagana.

Możesz także po prostu zwrócić dowolne pola z $map , ale na przykład zwracam tylko cały dokument.

Należy pamiętać, że ma to ograniczenie do nieprzekraczania limitu rozmiaru BSON wynoszącego 16 MB, więc jest w porządku dla małych próbek danych, ale wszystko, co tworzy potencjalnie dużą listę (ponieważ nie można wstępnie filtrować zawartości tablicy) byłoby lepiej przetworzone za pomocą oddzielne zapytanie, aby znaleźć wartości „max”, a drugie, aby pobrać pasujące dokumenty.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb :Sprawdź, czy punkt znajduje się wewnątrz zapisanego wielokąta

  2. Automatyzacja sprawdzania konfiguracji bazy danych

  3. Jak posortować tablicę w rekordzie kolekcji w MongoDB?

  4. Nie można ponownie uruchomić mongodb na Ubuntu 11.04

  5. Wyszukiwanie geoprzestrzenne Mongoose:odległość nie działa