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.