sql >> Base de Datos >  >> NoSQL >> MongoDB

Canalización e índices de agregación

Por lo general, solo los operadores de canalización que se pueden aplanar a una consulta normal ($match , $limit , $sort y $skip ) podrá usar los índices en una colección. Esta es una de las razones por las que $geoNear el operador agregado en 2.4 debe estar al comienzo de la canalización.

Una vez que muta los documentos con $project , $group , o $unwind el índice ya no es válido/utilizable.

Si tiene un índice en un campo de matriz, aún puede usarlo antes de $unwind para acelerar la selección de documentos para canalizar y luego refinar aún más los documentos seleccionados con un segundo $match .

Considere documentos como:

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

Con un índice en tags .

Si solo quisiera agrupar las etiquetas que comienzan con b entonces podría realizar una agregación como:

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

El primer $match ¿coincide el grano grueso usando el índice en tags? .

La segunda coincidencia después del $unwind no podrá usar el índice (el documento anterior ahora tiene 3 documentos), pero puede evaluar cada uno de esos documentos para filtrar los documentos adicionales que se crean (para eliminar {tags:'cat'} del ejemplo).

HTH - Rob.