Począwszy od MongoDB w wersji 3.0, wystarczy zmienić kolejność z
collection.aggregate(...).explain()
do
collection.explain().aggregate(...)
da pożądane rezultaty (dokumentacja tutaj ).
W przypadku starszych wersji> = 2,6 należy użyć explain
opcji dla operacji potoku agregacji
explain:true
db.collection.aggregate([
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{ $group: {
_id : "$_id",
count: { $sum:1 }
}},
{$sort: {"count":-1}}
],
{
explain:true
}
)
Ważnym czynnikiem przy agregacji ram jest to, że indeks może być użyty tylko do pobierania danych początkowych do rurociągu (np wykorzystania $match
, $sort
, $geonear
na początku przewodu rurowego), jak również późniejsze $lookup
i $graphLookup
etapy. Po pobraniu danych do potoku agregacji w celu ich przetworzenia (np. Przejścia przez etapy, takie jak $project
, $unwind
i $group
) dalsza manipulacja będzie przechowywana w pamięci (prawdopodobnie przy użyciu plików tymczasowych, jeśli allowDiskUse
opcja jest ustawiona).
Optymalizacja rurociągów
Ogólnie rzecz biorąc, możesz zoptymalizować potoki agregacji przez:
- Uruchomienie potoku z
$match
etapem ograniczenia przetwarzania do odpowiednich dokumentów.
- Zapewnienie, że początkowe
$match
/ $sort
etapy są obsługiwane przez skuteczny indeks .
- Filtrowanie danych za pomocą wcześnie
$match
, $limit
i $skip
.
- Minimalizowanie niepotrzebnych etapów i manipulacji dokumentami (być może ponowne rozważenie schematu, jeśli wymagana jest skomplikowana gimnastyka agregująca).
- Skorzystaj z nowszych operatorów agregacji, jeśli zaktualizowałeś serwer MongoDB. Na przykład MongoDB 3.4 dodano wiele nowych etapów agregacji i wyrażeń, w tym obsługę tablic, ciągów znaków i aspektów.
Istnieje również szereg optymalizacji potoku agregacji, które są wykonywane automatycznie w zależności od wersji serwera MongoDB. Na przykład sąsiednie etapy mogą być łączone i / lub zmieniane w kolejności w celu usprawnienia wykonania bez wpływu na wyniki wyjściowe.
Ograniczenia
Podobnie jak w MongoDB 3.4, explain
opcja Aggregation Framework zapewnia informacje o przetwarzaniu potoku, ale nie obsługuje tego samego poziomu szczegółowości, co executionStats
tryb find()
zapytania. Jeśli koncentrujesz się na optymalizacji początkowego wykonywania zapytania, prawdopodobnie korzystne będzie przejrzenie równoważnego find().explain()
zapytania z executionStats
lub allPlansExecution
szczegółowością .
W narzędziu do śledzenia problemów MongoDB dostępnych jest kilka żądań funkcji, które należy obserwować / głosować za bardziej szczegółowymi statystykami wykonania, aby pomóc zoptymalizować / profilować potoki agregacji:
$sort
znajdować się wewnątrz tablicy potoków?explain
ograniczeń struktury agregacji, a także odpowiednich żądań funkcji dotyczących dodatkowych statystyk wykonania.Począwszy od wersji 2.6.x mongodb pozwala użytkownikom na wyjaśnianie za pomocą frameworka agregacji .
Wystarczy dodać wyjaśnienie: prawda
Dzięki Rafie wiem, że dało się to zrobić nawet w 2.4, ale tylko przez
runCommand()
. Ale teraz możesz również użyć agregatu.źródło
db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})
od MongoDB 2.2.Struktura agregacji to zestaw narzędzi analitycznych,
MongoDB
które pozwalają nam uruchamiać różnego rodzaju raporty lub analizy dokumentów w jednej lub kilku kolekcjach. Oparty na idei rurociągu. Pobieramy dane wejściowe zMongoDB
kolekcji i przekazujemy dokumenty z tej kolekcji przez jeden lub więcej etapów, z których każdy wykonuje inną operację na swoich danych wejściowych. Każdy etap przyjmuje jako dane wejściowe bez względu na to, jaki etap przed nim wyprodukował jako dane wyjściowe. A wejścia i wyjścia dla wszystkich etapów to strumień dokumentów. Każdy etap ma określoną pracę, którą wykonuje. Oczekuje określonej formy dokumentu i generuje określone wyjście, które samo w sobie jest strumieniem dokumentów. Na końcu potoku uzyskujemy dostęp do wyjścia.Poszczególnym etapem jest jednostka przetwarzania danych. Każdy etap przyjmuje jako dane wejściowe strumień dokumentów pojedynczo, przetwarza każdy dokument pojedynczo i generuje strumień wyjściowy dokumentów. Znowu, pojedynczo. Każdy stopień zawiera zestaw pokręteł lub regulatorów, które możemy kontrolować, aby sparametryzować scenę, aby wykonać dowolne zadanie, które chcemy wykonać. Tak więc etap wykonuje ogólne zadanie - pewnego rodzaju zadanie ogólnego przeznaczenia i parametryzuje scenę dla określonego zestawu dokumentów, z którymi pracujemy. I dokładnie, co chcielibyśmy, aby ten etap robił z tymi dokumentami. Te strojenie zwykle przybierają postać operatorów, które możemy dostarczyć, które modyfikują pola, wykonują operacje arytmetyczne, przekształcają dokumenty lub wykonują jakieś zadania akumulacyjne, a także wiele innych rzeczy. Często zdarza się, że
np. możemy chcieć wykonać początkowy filtr, abyśmy nie musieli przekazywać całej kolekcji do naszego potoku. Ale później, po pewnym dodatkowym przetwarzaniu, chcesz ponownie filtrować przy użyciu innego zestawu kryteriów. Podsumowując, potok działa z
MongoDB
kolekcją. Składają się z etapów, z których każdy wykonuje inne zadanie przetwarzania danych na swoim wejściu i tworzy dokumenty jako dane wyjściowe, które mają być przekazane do następnego etapu. I w końcu na końcu potoku generowane jest wyjście, które możemy zrobić w naszej aplikacji. W wielu przypadkach konieczne jest wielokrotne włączanie tego samego typu etapu w ramach pojedynczego potoku.źródło