Обикновено само конвейерни оператори, които могат да бъдат сведени до нормална заявка ($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 - Роб.