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.