Obecně platí, že pouze operátory kanálu, které lze sloučit do normálního dotazu ($match
, $limit
, $sort
a $skip
) bude moci používat indexy na kolekci. To je jeden z důvodů $geoNear
operátor přidaný v 2.4 musí být na začátku kanálu.
Jakmile zmutujete dokumenty pomocí $project
, $group
nebo $unwind
index již není platný/použitelný.
Pokud máte index v poli pole, můžete jej stále použít před $unwind
pro urychlení výběru dokumentů do kanálu a následné další upřesnění vybraných dokumentů pomocí druhého $match
.
Zvažte dokumenty jako:
{ tags: [ 'cat', 'bird', 'blue' ] }
S indexem na tags
.
Pokud jste chtěli pouze seskupit značky začínající b
pak můžete provést agregaci jako:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
První $match
shoduje se hrubé zrno pomocí indexu na tags
.
Druhá shoda po $unwind
nebude moci použít index (výše uvedený dokument nyní obsahuje 3 dokumenty), ale může vyhodnotit každý z těchto dokumentů a odfiltrovat další dokumenty, které se vytvoří (pro odstranění { tags :'cat' } z příkladu).
HTH – Rob.