Généralement, seuls les opérateurs de pipeline pouvant être aplatis en une requête normale ($match
, $limit
, $sort
, et $skip
) pourront utiliser les index sur une collection. C'est l'une des raisons pour lesquelles $geoNear
l'opérateur ajouté en 2.4 doit être au début du pipeline.
Une fois que vous avez muté les documents avec $project
, $group
, ou $unwind
l'index n'est plus valide/utilisable.
Si vous avez un index sur un champ de tableau, vous pouvez toujours l'utiliser avant le $unwind
pour accélérer la sélection des documents à canaliser, puis affiner davantage les documents sélectionnés avec un second $match
.
Envisagez des documents tels que :
{ tags: [ 'cat', 'bird', 'blue' ] }
Avec un index sur les tags
.
Si vous souhaitez uniquement regrouper les balises commençant par b
alors vous pourriez effectuer une agrégation comme :
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
Le premier $match
est-ce que le grain grossier correspond à l'aide de l'index sur les tags
.
La deuxième correspondance après le $unwind
ne pourra pas utiliser l'index (le document ci-dessus est maintenant composé de 3 documents) mais peut évaluer chacun de ces documents pour filtrer les documents supplémentaires qui sont créés (pour supprimer { tags :'cat' } de l'exemple).
HTH - Rob.