$match
および$group
ステージで集約フレームワークを使用しようとしています。 $group
ステージはインデックスデータを使用しますか?利用可能な最新のmongodbバージョンを使用しています-2.5.4
$group
はインデックスデータを使用しません。
MongoDBから docs :
$ matchおよび$ sortパイプラインオペレーターは、パイプラインの先頭で発生したときにインデックスを利用できます。
$ geoNearパイプライン演算子は、地理空間インデックスを利用します。 $ geoNearを使用する場合、$ geoNearパイプラインオペレーションは、集約パイプラインの最初のステージとして表示される必要があります。
4J41の回答にあるように、_$group
_は(直接)インデックスを使用しませんが、_$sort
_は、パイプラインの最初のステージの場合は使用します。ただし、_$group
_が_$sort
_の直後にある場合は、原則として_$sort
_が最適化された実装を持つ可能性があります。その場合、__(SOMECODE) )__事前に。
_$group
_にこの最適化があるかどうかについてのドキュメントには、どちらの方法でも簡単な答えはないようです(そうした場合はあると思いますが、そうではないためです)。回答は MongoDBバグ4507 にあります。現在、_$group
_にはこの実装がないため、4J41の回答の最初の行は結局正しいです。本当に効率が必要な場合は、アプリケーションによっては、通常のクエリを使用してクライアントコードでグループ化するのが最も速い場合があります。
編集:セバスチャンの答えが言うように、実際には_$sort
_の前に_$group
_(インデックスを利用できる)を使用すると、速度が大幅に向上するようです。上記のバグはまだ開いているため、インデックスの利点を最大限に生かしているようには見えません(つまり、アイテムをすべてメモリに最初にロードするのではなく、ロード時にアイテムのグループ化を開始します)。しかし、それは確かにやる価値があります。
@ ArthurTacca、Mongo 4.0以降$sort
前$group
は物事を大幅にスピードアップします。 https://stackoverflow.com/a/56427875/92049 を参照してください。
バージョン3.2で変更:MongoDB 3.2以降、インデックスは集約パイプラインをカバーできます。 MongoDB 2.6および3.0では、パイプラインがインデックスを使用する場合でも、集計は実際のドキュメントへのアクセスを必要とするため、インデックスは集計パイプラインをカバーできませんでした。
https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes