Geralmente, apenas operadores de pipeline que podem ser nivelados para uma consulta normal (
$match
, $limit
, $sort
e $skip
) poderá usar os índices em uma coleção. Esta é uma das razões pelas quais o $geoNear
operador adicionado em 2.4 deve estar no início do pipeline. Depois de alterar os documentos com
$project
, $group
, ou $unwind
o índice não é mais válido/utilizável. Se você tiver um índice em um campo de matriz, ainda poderá usá-lo antes do
$unwind
para acelerar a seleção de documentos para o pipeline e refinar ainda mais os documentos selecionados com um segundo $match
. Considere documentos como:
{ tags: [ 'cat', 'bird', 'blue' ] }
Com um índice em
tags
. Se você quiser apenas agrupar as tags começando com
b
então você pode executar uma agregação como:{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
O primeiro
$match
a granulação grossa corresponde usando o índice em tags
. A segunda correspondência após o
$unwind
não poderá usar o índice (o documento acima agora tem 3 documentos), mas pode avaliar cada um desses documentos para filtrar os documentos extras que são criados (para remover { tags :'cat' } do exemplo). HTH - Rob.