Wprowadzenie
W tym artykule przedstawię Ci Mongodb group by multiple fields. Aby lepiej to zrozumieć najpierw poznamy funkcję agregacji.
Funkcja agregacji MongoDB
Funkcje agregacji są używane w klauzulach GROUP BY do agregowania zgrupowanych danych. Funkcje agregujące działają lepiej, gdy są używane z klauzulą GROUP BY. Jednak użycie funkcji agregujących nie jest ograniczone do zapytań grupowych.
Gdy funkcja agregująca jest użyta w zapytaniu bez klauzuli GROUP BY, funkcja agregująca agreguje cały zestaw wyników (wszystkie wiersze, które odpowiadają klauzuli WHERE). Jeśli nie używasz klauzuli GROUP BY, niektóre funkcje agregujące na liście SELECT mogą być użyte tylko z innymi funkcjami agregującymi. Dlatego funkcja agregująca musi używać klauzuli GROUP BY, aby połączyć się z listą na liście SELECT.
Na przykład, zamiast używać klauzuli GROUP BY, AVG na liście SELECT może odpowiadać tylko SUM, ale nie może odpowiadać konkretnej kolumnie.
Operacja agregacji MongoDB jest używana do operacji wsadowych na danych. Po pogrupowaniu kolekcji według warunku wykonywana jest seria operacji, takich jak suma, średnia i inne. Operacje agregacji mogą wykonywać złożone operacje na zbiorach, szczególnie w przypadku statystyk matematycznych i eksploracji danych.
Wejściem operacji agregacji w MongoDB jest dokument kolekcji. Dane wyjściowe mogą być jednym lub wieloma dokumentami. MongoDB oferuje bardzo potężne operacje agregacji, które można podzielić na trzy kategorie:
- Aggregation pipeline
- Agregation operation for single use
- MapReduce programming model
Mongodb Group by Multiple Fields
Operator $ group jest agregatorem, który zwraca nowy dokument. Ma on swój własny operator, możemy uzyskać pole bieżącego dokumentu przez $ symbol + nazwa pola. Aby najpierw zrozumieć działanie MongoDB grupowania według wielu pól, spójrzmy na listę wszystkich operatorów, które mogą być użyte w $ group:
- $ sum – Zwraca sumę wszystkich pól numerycznych.
- $ avg – Oblicza średnią między polami numerycznymi.
- $ min – Zwraca minimalną wartość z pola numerycznego
- $ max – Uzyskuje maksymalną wartość z pola numerycznego.
- $ push – wstawia wartość pola do pola wynikowego
- $ addToSet – wstawia wartość do tablicy dokumentu wynikowego, ale nie tworzy duplikatów.
- $ first – Pobiera tylko pierwszy dokument z pogrupowanych, zwykle w celu sortowania.
- $ last – Zwraca ostatni dokument.
Potok agregacji
W wielowątkowym trybie POSIX istnieje metoda zwana potokiem, której strumień elementów danych jest wykonywany sekwencyjnie przez zestaw wątków w określonej kolejności.Potok agregacji składa się z etapu. Po przetworzeniu dokumentu w jednym etapie, potok agregacji przekazuje wynik przetwarzania do następnego etapu.
Funkcja rury polimerowej Filtruj dokument, aby dowiedzieć się, które dokumenty spełniają określone kryteria. Konwertuj dokument i zmień formę wyjściową dokumentu.
Każdy poziom potoku agregacji jest definiowany za pomocą operatorów etapów, a każdy operator etapu może używać operatorów wyrażeń do obliczania sumy, średniej, konkatenacji lub łamania linii przed każdym poziomem. Wynik jest zwracany na końcu, a zwrócony wynik może być bezpośrednio wyprowadzony lub zapisany w kolekcji.
Przepływ przetwarzania
- Db.collection.aggregate () może używać kilku kanałów w tym samym czasie do przetwarzania danych.
- Db.collection.aggregate () wykorzystuje natywne operacje MongoDB do wydajnego agregowania i obsługi operacji takich jak GroupBy w SQL bez konieczności pisania niestandardowych procedur JS.
- Każda faza potoku ogranicza 100 MB pamięci. Jeśli potok pojedynczego węzła przekroczy ten limit, MongoDB wygeneruje błąd. Aby przetwarzać duże ilości danych, ustaw właściwość allowDiskUse na true, aby zapisać dane w pliku tymczasowym dla zagregowanego węzła potoku i zezwolić na limit pamięci 100 MB.
- Db.collection.aggregate () może być zastosowany do serii plasterków, ale wynik nie może zostać utracony w serii plasterków. MapReduce może być zastosowany do serii plasterków, a wynik może zostać utracony w serii plasterków.
- Db.collection.aggregate () zwraca kursor, dane są przechowywane w pamięci i mogą być zarządzane bezpośrednio jako MongoShell.
- Wyjście z db.collection.aggregate () może być zapisane tylko w jednym dokumencie, a rozmiar dokumentu BSON jest ograniczony do 16 MB.
Metoda grupowania
Używanie metody group jest podobne do używania klauzuli GROUP BY w SQL. Metoda group ma trzy parametry:
- Key: Wyświetla klucz grupy
- Initial: Inicjalizuje pole dokumentu, które reprezentuje grupę dokumentów
- Reduce: Funkcja, która zwraca liczbę elementów. Ta funkcja używa dwóch parametrów jako argumentów: bieżącego elementu i zagregowanego dokumentu wynikowego dla bieżącej grupy.
- Keyf: parametr opcjonalny. Użyj funkcji innej niż argument klucz do reprezentowania obiektu klucza zwrotnego.
- Koniec: parametr opcjonalny. Określa, że warunek powinien zwracać wartość true, w przeciwnym razie dokument nie będzie uczestniczył w grupowaniu. Jeśli ten parametr nie jest określony, wszystkie dokumenty biorą udział w grupowaniu.
- Finalize: parametr opcjonalny. Reprezentuje funkcję, która jest uruchamiana przed zwróceniem zgrupowanego wyniku.
Na przykład:`
js> db.users.group ({key: {name : true}, initial: {total : 0},reduce : function (curr, res){res.total += 1}})`
Przyjrzyjrzyjmy się temu wyrażeniu. Parametr key określa, że grupa będzie grupowana według nazwy: key: {name: true}
Wartość parametru initial inicjalizuje pola, które reprezentują dokument wynikowy dla grupy. W tym przypadku ustawiana jest wartość początkowa pola total. Pole to określa liczbę elementów w grupie. Ponieważ może nie być żadnych elementów, inicjalizujemy do zera.
Parametr reduce reprezentuje funkcję, w której parametr curr wskazuje na bieżący obiekt w grupie, a res reprezentuje bieżącą grupę. Jeśli znajdziesz inny obiekt z określoną wartością dla pola name, dodaj ten dokument do grupy i zwiększ całkowitą wartość w dokumencie res o 1.
Użycie $group
Parametr $group używa _id do określenia nazwy klucza, który ma zostać zgrupowany, używając niestandardowych statystyk pola. Użycie operacji agregacji spowoduje usunięcie koncepcji grupowania Mongodb według wielu pól.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
db.users.aggregate({
$match : { age: { $gte : 18 } } },{ $group : { _id:$username, count:{$sum:1}. } }); // Mongodb group by multiple fields db.users.aggregate({ $match: {age: {$gte:18} }}, $group: {_id:{username:$username, age:$ge}, 'count’:{$sum:1} } }) // $sum:val Dodaj wartość val do każdego dokumentu // $avg:val Uśrednij wartość każdego dokumentu db.users.aggregate({ $group: { _id:$username, count:{$avg:$age} } }) db.users.aggregate({ $group: { _id:$username, count:{$max:$age} } }) db.users.aggregate({ $group: {_id:$username, count:{$min:$age} } }) // $first:val Zostań pierwszym w grupie db.users.aggregate({ $group:{_id:$username, count:{$first: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$last: $age} } }) db.users.aggregate({ $group: {_id:$username, count:{$addToSet: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$push: $age} } }) |
Mongodb group by multiple fields using Aggregate operation
Najpierw wybierany jest klucz, na którym oparte jest grupowanie, a następnie kolekcja jest dzielona na grupy według wybranej wartości klucza. Następnie można utworzyć dokument końcowy, agregując dokumenty w każdej grupie.
Grupa nie obsługuje klastrów fragmentarycznych i nie może wykonywać klastrowania shard. Jeśli potrzebujesz wsparcia rozproszonego, musisz użyć aggregate lub mapReduce.
1
2 3 4 5 6 7 8 9 10 11 12 13 |
db.collection.group(document)
{ # Pole grupujące key:{key1, key2:1}, # Warunki zapytania cond:{}, # Funkcja agregująca reduce:function(current, result){}, # Inicjalizacja initial:{}, # Zliczanie funkcji zwrotnej Set finalize:function(){} }. |
Oblicz liczbę elementów w każdej kolumnie
1
2 3 4 5 6 7 8 9 |
SELECT COUNT(*) FROM goods GROUP BY category_id;
db.goods.group({ key:{category_id:1}, cond:{},// wszystko razem reduce:function(current, result){// Odpowiadanie na bieżący wiersz,result Odpowiadanie na wiele wierszy w grupie result.total += 1; }, initial:{total:0} }) |
Podsumowanie
Ten artykuł jest napisany dla programistów, aby zrozumieć Mongodb group by multiple fields using aggregate function. Jeśli uważasz, że ten artykuł jest przydatny odwiedzaj Object Rocket po więcej artykułów związanych z bazami danych.
Jeśli potrzebujesz porady lub pomocy w zakresie zarządzania bezpieczeństwem bazy danych, skalowalnością lub kopiami zapasowymi, skontaktuj się z nami w Object Rocket.