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.