MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aggregationspipeline und Indizes

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.