Operacje agregacji przetwarzają rekordy danych i zwracają obliczone wyniki. Operacje agregacji grupują wartości z wielu dokumentów razem i mogą wykonywać różne operacje na zgrupowanych danych, aby zwrócić pojedynczy wynik. W SQL count(*) i with group by jest odpowiednikiem agregacji w MongoDB.
Metoda aggregate()
Do agregacji w MongoDB powinieneś użyć metody aggregate().
Syntaktyka
Podstawowa składnia metody aggregate() jest następująca –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Przykład
W kolekcji masz następujące dane –
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Teraz na podstawie powyższej kolekcji, jeśli chcesz wyświetlić listę z informacją ile tutoriali zostało napisanych przez każdego użytkownika, użyjesz następującej metody aggregate() –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Sql odpowiednikiem zapytania dla powyższego przypadku użycia będzie select by_user, count(*) from mycol group by_user.
W powyższym przykładzie pogrupowaliśmy dokumenty po polu by_user i przy każdym wystąpieniu by user poprzednia wartość sumy jest inkrementowana. Poniżej znajduje się lista dostępnych wyrażeń agregujących.
Wyrażenie | Opis | Przykład |
---|---|---|
$sum | Sumuje zdefiniowaną wartość ze wszystkich dokumentów w kolekcji. | db.mycol.aggregate() |
$avg | Oblicza średnią wszystkich podanych wartości ze wszystkich dokumentów w kolekcji. | db.mycol.aggregate() |
$min | Uzyskuje minimum odpowiednich wartości ze wszystkich dokumentów w kolekcji. | db.mycol.aggregate() |
$max | Uzyskuje maksimum odpowiednich wartości ze wszystkich dokumentów w kolekcji. | db.mycol.aggregate() |
$push | Wpisuje wartość do tablicy w dokumencie wynikowym. | db.mycol.aggregate() |
$addToSet | Wpisuje wartość do tablicy w dokumencie wynikowym, ale nie tworzy duplikatów. | db.mycol.aggregate() |
$first | Uzyskuje pierwszy dokument z dokumentów źródłowych zgodnie z grupowaniem. Zazwyczaj ma to sens tylko w połączeniu z jakimś wcześniej zastosowanym „$sort”-stage. | db.mycol.aggregate() |
$last | Uzyskuje ostatni dokument z dokumentów źródłowych zgodnie z grupowaniem. Zazwyczaj ma to sens tylko w połączeniu z jakimś wcześniej zastosowanym „$sort”-stage. | db.mycol.aggregate() |
Koncepcja rurociągu
W komendach UNIX, rurociąg powłoki oznacza możliwość wykonania operacji na jakimś wejściu i użycia wyjścia jako wejścia dla następnej komendy i tak dalej. MongoDB również wspiera tę samą koncepcję w ramach agregacji. Istnieje zestaw możliwych etapów i każdy z nich jest traktowany jako zestaw dokumentów jako wejście i produkuje wynikowy zestaw dokumentów (lub ostateczny wynikowy dokument JSON na końcu rurociągu). To z kolei może być wykorzystane do następnego etapu i tak dalej.
Następujące są możliwe etapy w ramach agregacji –
-
$projekt – Służy do wybierania określonych pól z kolekcji.
-
$match – Jest to operacja filtrowania, a więc może zmniejszyć ilość dokumentów, które są podawane jako dane wejściowe do następnego etapu.
-
$group – Wykonuje rzeczywistą agregację, jak omówiono powyżej.
-
$sort – Sortuje dokumenty.
-
$skip – Za jego pomocą możliwe jest pominięcie do przodu na liście dokumentów dla danej ilości dokumentów.
-
$limit – Służy do ograniczenia ilości przeglądanych dokumentów o podaną ilość począwszy od aktualnych pozycji.
-
$unwind – Służy do rozwijania dokumentów, które wykorzystują tablice. Kiedy używamy tablicy, dane są jakby wstępnie połączone i ta operacja zostanie cofnięta za pomocą tego, aby mieć ponownie pojedyncze dokumenty. Dzięki temu w tym etapie zwiększymy ilość dokumentów do następnego etapu.
.