通常、通常のクエリ($match)にフラット化できるパイプライン演算子のみ 、$limit 、$sort 、および$skip )コレクションのインデックスを使用できるようになります。これが、$geoNearの理由の1つです。 2.4で追加された演算子は、パイプラインの開始時にある必要があります。
$projectでドキュメントを変更したら 、$group 、または$unwind インデックスは無効/使用できなくなりました。
配列フィールドにインデックスがある場合でも、$unwindの前に使用できます。 パイプラインするドキュメントの選択を高速化し、選択したドキュメントを2番目の$matchでさらに絞り込みます。 。
次のようなドキュメントを検討してください:
{ tags: [ 'cat', 'bird', 'blue' ] }
tagsにインデックスを付ける 。
bで始まるタグのみをグループ化する場合 次に、次のような集計を実行できます:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
最初の$match tagsのインデックスを使用して粗粒度を一致させますか 。
$unwindの後の2番目の一致 インデックスを使用することはできませんが(上記のドキュメントは3つのドキュメントになります)、これらの各ドキュメントを評価して、作成される余分なドキュメントを除外できます(例から{tags:'cat'}を削除します)。
HTH-ロブ。