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.