Jest wiele rzeczy do zrobienia, aby zoptymalizować zapytanie. Co bym spróbował :
-
Jak powiedział Anthony Winzlet w komentarzach, jako pierwszy należy użyć etapu $match. W ten sposób możesz zmniejszyć liczbę dokumentów przekazywanych do kolejnych etapów i korzystać z indeksów.
-
Zakładając, że używasz co najmniej wersji 3.6 mongo, zmień etapy wyszukiwania za pomocą składni „let/pipeline” (zobacz tutaj ). W ten sposób możesz zintegrować swoje 'filtry zewnętrzne' ( "customer_info.status":{$ne:9}, "model_info.status":{$ne:9} ) w etapie $match w potoku wyszukiwania. Dzięki indeksom w odpowiednich polach / kolekcjach zyskasz trochę czasu / pamięci na etapach wyszukiwania.
-
Rozpocznij etapy tak późno, jak to możliwe, aby ograniczyć liczbę dokumentów przekazywanych do kolejnych etapów.
Ważne jest, aby zrozumieć, jak działa potok agregacji:każdy etap odbiera dane, wykonuje swoje zadania i przekazuje dane do następnego etapu. Im mniej danych zostanie przekazanych do potoku, tym szybsze będzie Twoje zapytanie.