Im Allgemeinen sind nur Pipelineoperatoren, die auf eine normale Abfrage reduziert werden können ($match , $limit , $sort , und $skip ) können die Indizes für eine Sammlung verwenden. Dies ist einer der Gründe für $geoNear Der in 2.4 hinzugefügte Operator muss am Anfang der Pipeline stehen.
Sobald Sie die Dokumente mit $project mutieren , $group , oder $unwind der Index ist nicht mehr gültig/verwendbar.
Wenn Sie einen Index für ein Array-Feld haben, können Sie ihn trotzdem vor dem $unwind verwenden um die Auswahl der Dokumente für die Pipeline zu beschleunigen und die ausgewählten Dokumente dann mit einem zweiten $match weiter zu verfeinern .
Betrachten Sie Dokumente wie:
{ tags: [ 'cat', 'bird', 'blue' ] }
Mit einem Index auf tags .
Wenn Sie nur die Tags gruppieren möchten, die mit b beginnen dann könnten Sie eine Aggregation durchführen wie:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
Das erste $match stimmt die grobe Körnung mit dem Index auf tags überein .
Das zweite Match nach dem $unwind wird den Index nicht verwenden können (das obige Dokument besteht jetzt aus 3 Dokumenten), kann aber jedes dieser Dokumente auswerten, um die zusätzlichen Dokumente herauszufiltern, die erstellt werden (um { tags :'cat' } aus dem Beispiel zu entfernen).
HTH - Rob.