Een paar dingen die u hier kunt doen:
Gebruik allereerst een $in in plaats van een $or.
Ten tweede kan MongoDB alleen gebruik een index voor je eerste match, dus je zult moeten beslissen (door het uit te proberen) welke van de twee matches beter is. Het doel is om zo snel een query te hebben en er minder documenten door uw pijplijn gaan. Daarvoor doe je de volgende dingen:
Maak eerst de drie indexen:
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );
Voer vervolgens de volgende drie zoekopdrachten uit en let op de velden "cursor", "n", "nScanned" en "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();
Voor de laatste zoekopdracht zul je merken dat "cursor" "BasicCursor" is, omdat een $ne-zoekopdracht de index niet kan gebruiken.
De andere twee tonen u verschillende waarden voor "ms", "n" en "nScanned". "ms" is de tijd die nodig was om de query uit te voeren. Als dit ongeveer hetzelfde is, kijk dan naar het verschil tussen de "n" en "nScanned" waarden. Ik ga ervan uit dat het verschil voor de "versions.branch"-query 0 is. Voor de "doctype"-query kan het anders zijn. Als de "ms" niet ongeveer hetzelfde is, plaatst u de $ match die het snelst was eerst als $match-clausule in uw aggregatiepijplijn.
Als de snelheid ("ms") beide hetzelfde is, controleer dan de "n"-waarden. Als de "n" voor de "prefix"-query bijvoorbeeld "5" is en de "n" voor de "versions.branch"-query "500" is, betekent dit dat het resultaat van de "prefix"-query beter is, omdat minder documenten worden teruggestuurd. Zet dat in dat geval als uw eerste $ match-clausule in totaal. Als de "versions.branch" veel minder is, gebruik die dan als eerste $match-clausule.