Generelt er det kun pipeline-operatorer, der kan udflades til en normal forespørgsel ($match
, $limit
, $sort
, og $skip
) vil kunne bruge indekserne på en samling. Dette er en af grundene til, at $geoNear
operatør tilføjet i 2.4 skal være ved starten af pipelinen.
Når du muterer dokumenterne med $project
, $group
, eller $unwind
indekset er ikke længere gyldigt/brugbart.
Hvis du har et indeks på et matrixfelt, kan du stadig bruge det før $unwind
for at fremskynde udvælgelsen af dokumenter til pipeline og derefter forfine de valgte dokumenter yderligere med en anden $match
.
Overvej dokumenter som:
{ tags: [ 'cat', 'bird', 'blue' ] }
Med et indeks på tags
.
Hvis du kun ønskede at gruppere tags, der starter med b
så kunne du udføre en sammenlægning som:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
Den første $match
matcher det grove korn ved hjælp af indekset på tags
.
Den anden kamp efter $unwind
vil ikke være i stand til at bruge indekset (dokumentet ovenfor er nu 3 dokumenter), men kan evaluere hvert af disse dokumenter for at bortfiltrere de ekstra dokumenter, der bliver oprettet (for at fjerne { tags :'cat' } fra eksemplet).
HTH - Rob.