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.