Kilka rzeczy, które możesz tutaj zrobić:
Przede wszystkim użyj $in zamiast $lub.
Po drugie, MongoDB może tylko użyj indeksu dla pierwszego dopasowania, więc będziesz musiał zdecydować (poprzez wypróbowanie), które z dwóch dopasowań jest lepsze. Celem jest uzyskanie jak najszybszego zapytania i jak najmniejszej liczby dokumentów przechodzących przez potok. W tym celu wykonaj następujące czynności:
Najpierw utwórz trzy indeksy:
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );
Następnie uruchom następujące trzy zapytania i zwróć uwagę na pola „kursor”, „n”, „nScanned” i „ms”:
branch = "nameofbranch"; // guessing here
db.element.find( "versions.branch": branch ).explain();
db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
db.element.find( "prefix": { $ne: "500" } ).explain();
W przypadku ostatniego zapytania zauważysz, że „kursor” to „BasicCursor”, ponieważ zapytanie $ne nie może korzystać z indeksu.
Pozostałe dwa pokażą różne wartości dla „ms”, „n” i „nScanned”. „ms” to czas potrzebny na uruchomienie zapytania. Jeśli jest w przybliżeniu taki sam, spójrz na różnicę między wartościami „n” i „nScanned”. Mam zamiar oczekiwać i zgadywać, że różnica dla zapytania „versions.branch” wynosi 0. Dla zapytania „doctype” może być inaczej. Jeśli „ms” nie jest w przybliżeniu taki sam, wpisz $match, który był najszybszy najpierw jako klauzula $match w potoku agregacji.
Jeśli prędkość ("ms") jest taka sama, sprawdź wartości "n". Jeśli „n” dla zapytania „prefix” to „5”, a „n” dla zapytania „versions.branch” to „500”, oznacza to, że wynik zapytania „prefix” jest lepszy, ponieważ mniej dokumenty są zwracane. W takim przypadku umieść to jako pierwszą klauzulę $match łącznie. Jeśli "versions.branch" jest dużo mniej, użyj go jako pierwszej klauzuli $match.