通常、通常のクエリ($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-ロブ。