MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pipeline d'agrégation et index

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.