Няколко неща, които можете да направите тук:
Преди всичко използвайте $in вместо $or.
Второ, MongoDB може само използвайте индекс за първото си съвпадение, така че ще трябва да решите (като го изпробвате) кое от двете съвпадения е по-добро. Целта е да имате възможно най-бързо запитване и възможно най-малко документи, преминаващи през вашия конвейер. За целта правите следните неща:
Първо създайте трите индекса:
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );
След това изпълнете следните три заявки и забележете полетата „cursor“, „n“, „nScanned“ и „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();
За последната заявка ще забележите, че "cursor" е "BasicCursor", тъй като $ne заявка не може да използва индекса.
Другите две ще ви покажат различни стойности за "ms", "n" и "nScanned". "ms" е времето, необходимо за изпълнение на заявката. Ако това е приблизително същото, тогава вижте разликата между стойностите "n" и "nScanned". Ще очаквам и предполагам, че разликата за заявката "versions.branch" е 0. За заявката "doctype" може да е различно. Ако "ms" не е приблизително същото, поставете $match, което е било най-бързо първо като клауза $match във вашия канал за агрегиране.
Ако и двете скорости ("ms") са еднакви, проверете стойностите "n". Ако "n" за заявката "prefix" е "5", а "n" за заявката "versions.branch" е "500", тогава това означава, че резултатът от заявката "prefix" е по-добър, тъй като по-малко документи се връщат. В такъв случай поставете това като първата си обобщена клауза за съвпадение. Ако "versions.branch" е много по-малко, използвайте това като първа клауза за $match.