MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Pipeline di aggregazione e indici

In genere, solo gli operatori della pipeline che possono essere convertiti in una query normale ($match , $limit , $sort e $skip ) sarà in grado di utilizzare gli indici su una raccolta. Questo è uno dei motivi per cui $geoNear l'operatore aggiunto in 2.4 deve trovarsi all'inizio della pipeline.

Dopo aver mutato i documenti con $project , $group o $unwind l'indice non è più valido/utilizzabile.

Se hai un indice su un campo array puoi ancora usarlo prima di $unwind per velocizzare la selezione dei documenti da pipeline e poi perfezionare ulteriormente i documenti selezionati con un secondo $match .

Considera documenti come:

{ tags: [ 'cat', 'bird', 'blue' ] }

Con un indice su tags .

Se volessi raggruppare solo i tag che iniziano con b quindi potresti eseguire un'aggregazione come:

{ pipeline: [
      { $match : { tags : /^b/ } },
      { $unwind : '$tags' },
      { $match : { tags : /^b/ } },
      /* the rest */
  ] }

Il primo $match la grana grossa corrisponde usando l'indice su tags .

La seconda corrispondenza dopo $unwind non sarà in grado di utilizzare l'indice (il documento sopra è ora 3 documenti) ma può valutare ciascuno di quei documenti per filtrare i documenti extra che vengono creati (per rimuovere { tags :'cat' } dall'esempio).

HTH - Rob.