Обикновено само конвейерни оператори, които могат да бъдат сведени до нормална заявка ($match , $limit , $sort и $skip ) ще могат да използват индексите на колекция. Това е една от причините $geoNear операторът, добавен в 2.4, трябва да бъде в началото на конвейера.
След като промените документите с $project , $group или $unwind индексът вече не е валиден/използваем.
Ако имате индекс на поле от масив, пак можете да го използвате преди $unwind за да ускорите избора на документи за конвейер и след това допълнително да прецизирате избраните документи с второ $match .
Помислете за документи като:
{ tags: [ 'cat', 'bird', 'blue' ] }
С индекс на tags .
Ако искате да групирате само етикетите, започващи с b тогава можете да извършите агрегиране като:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
Първият $match съвпада ли грубото зърно с помощта на индекса на tags .
Вторият мач след $unwind няма да може да използва индекса (документът по-горе вече е 3 документа), но може да оцени всеки от тези документи, за да филтрира допълнителните документи, които се създават (за да премахнете { tags :'cat' } от примера).
HTH - Роб.