Několik věcí, které můžete udělat zde:
Nejprve použijte $in místo $or.
Za druhé, MongoDB umí pouze použijte index pro svou první shodu, takže se budete muset rozhodnout (vyzkoušením), která ze dvou shod je lepší. Cílem je mít tak rychlý dotaz a co méně dokumentů procházejících vaším kanálem. Pro to uděláte následující věci:
Nejprve vytvořte tři indexy:
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );
Poté spusťte následující tři dotazy a všimněte si polí "kurzor", "n", "nScanned" a "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();
U posledního dotazu si všimnete, že "cursor" je "BasicCursor", protože $ne dotaz nemůže použít index.
Další dva vám zobrazí různé hodnoty pro „ms“, „n“ a „nScanned“. "ms" je doba potřebná ke spuštění dotazu. Pokud je to přibližně stejné, podívejte se na rozdíl mezi hodnotami "n" a "nScanned". Budu očekávat a odhadovat, že rozdíl pro dotaz „versions.branch“ je 0. U dotazu „doctype“ to může být jiné. Pokud „ms“ není přibližně stejné, zadejte $match, který byl nejrychlejší nejprve jako $match clause ve vašem agregačním kanálu.
Pokud jsou obě rychlosti ("ms") stejné, zkontrolujte hodnoty "n". Pokud je "n" pro dotaz "prefix" řekněme "5" a "n" pro dotaz "versions.branch" je "500", znamená to, že výsledek dotazu "prefix" je lepší, protože méně dokumenty jsou vráceny. V takovém případě to uveďte jako svou první $match klauzuli v souhrnu. Pokud je "versions.branch" mnohem menší, použijte tuto klauzuli jako první $match klauzuli.