Over het algemeen alleen pijplijnoperators die kunnen worden afgevlakt tot een normale zoekopdracht ($match
, $limit
, $sort
, en $skip
) de indexen van een verzameling kunnen gebruiken. Dit is een van de redenen waarom de $geoNear
operator toegevoegd in 2.4 moet aan het begin van de pijplijn staan.
Zodra u de documenten muteert met $project
, $group
, of $unwind
de index is niet langer geldig/bruikbaar.
Als u een index op een arrayveld heeft, kunt u deze nog steeds gebruiken vóór de $unwind
om de selectie van documenten naar pijplijn te versnellen en vervolgens de geselecteerde documenten verder te verfijnen met een tweede $match
.
Overweeg documenten als:
{ tags: [ 'cat', 'bird', 'blue' ] }
Met een index op tags
.
Als u alleen de tags wilt groeperen die beginnen met b
dan zou je een aggregatie kunnen uitvoeren zoals:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
De eerste $match
komt de grove korrel overeen met behulp van de index op tags
.
De tweede wedstrijd na de $unwind
zal de index niet kunnen gebruiken (het document hierboven bestaat nu uit 3 documenten) maar kan elk van die documenten evalueren om de extra documenten die worden aangemaakt eruit te filteren (om { tags :'cat' } uit het voorbeeld te verwijderen).
HTH - Rob.