I allmänhet är det bara pipeline-operatörer som kan platta till en normal fråga ($match
, $limit
, $sort
och $skip
) kommer att kunna använda indexen på en samling. Detta är en av anledningarna till att $geoNear
operatör som lagts till i 2.4 måste vara i början av pipelinen.
När du har muterat dokumenten med $project
, $group
, eller $unwind
indexet är inte längre giltigt/användbart.
Om du har ett index på ett matrisfält kan du fortfarande använda det före $unwind
för att påskynda valet av dokument som ska pipeline och sedan ytterligare förfina de valda dokumenten med en andra $match
.
Tänk på dokument som:
{ tags: [ 'cat', 'bird', 'blue' ] }
Med ett index på tags
.
Om du bara ville gruppera taggarna som börjar med b
då kan du utföra en aggregering som:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
Den första $match
stämmer grovkornen med indexet på tags
.
Den andra matchningen efter $unwind
kommer inte att kunna använda indexet (dokumentet ovan är nu 3 dokument) men kan utvärdera vart och ett av dessa dokument för att filtrera bort de extra dokument som skapas (för att ta bort { taggar :'katt' } från exemplet).
HTH - Rob.