Ogólnie tylko operatory potoku, które można spłaszczyć do normalnego zapytania ($match , $limit , $sort i $skip ) będą mogli używać indeksów w kolekcji. To jeden z powodów, dla których $geoNear operator dodany w 2.4 musi być na początku potoku.
Po zmutowaniu dokumentów za pomocą $project , $group lub $unwind indeks nie jest już ważny/użyteczny.
Jeśli masz indeks w polu tablicy, nadal możesz go używać przed $unwind w celu przyspieszenia wyboru dokumentów do potoku, a następnie dalszego udoskonalenia wybranych dokumentów za pomocą drugiego $match .
Rozważ dokumenty takie jak:
{ tags: [ 'cat', 'bird', 'blue' ] }
Z indeksem na tags .
Jeśli chcesz tylko pogrupować tagi zaczynające się od b wtedy możesz przeprowadzić agregację, taką jak:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
Pierwszy $match czy grube ziarno pasuje do indeksu tags .
Drugie dopasowanie po $unwind nie będzie mógł korzystać z indeksu (powyższy dokument zawiera teraz 3 dokumenty), ale może ocenić każdy z tych dokumentów, aby odfiltrować dodatkowe dokumenty, które zostaną utworzone (aby usunąć { tagi :'cat' } z przykładu).
HTH - Rob.