Ogłoszenia

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.

Reklamy

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.