MongoDBドキュメントから:
集計パイプラインのできるだけ早い段階で $match を配置します。$match は集約パイプライン内のドキュメントの総数を制限するため、以前の $match 操作はパイプの処理量を最小限に抑えます。
パイプラインの最初に $match を配置すると、クエリは他の db.collection.find() または db.collection.findOne() と同様にインデックスを利用できます。
与えられたクエリ
db.articles.aggregate( [
{ $match : {date : {$gt: now, $lte: later } } },
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
ここで (もちろん) 現在と後で、適切にフォーマットされた日付を表します。
集計フレームワークは、2 番目の一致 (利用可能な場合) にインデックスを使用するか、またはインデックスを使用する資格がある集計パイプラインの最初の一致のみです。
クエリは次のように実行されますか?
db.articles.aggregate( [
{ $match : {date : {$gt: now, $lte: later }, score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
日付とスコアをカバーするインデックスが存在すると仮定しますか?