web-dev-qa-db-ja.com

Mongodb Aggregation Framework:$ groupはインデックスを使用しますか?

$matchおよび$groupステージで集約フレームワークを使用しようとしています。 $groupステージはインデックスデータを使用しますか?利用可能な最新のmongodbバージョンを使用しています-2.5.4

26
fedor.belov

$groupはインデックスデータを使用しません。

MongoDBから docs

$ matchおよび$ sortパイプラインオペレーターは、パイプラインの先頭で発生したときにインデックスを利用できます。

$ geoNearパイプライン演算子は、地理空間インデックスを利用します。 $ geoNearを使用する場合、$ geoNearパイプラインオペレーションは、集約パイプラインの最初のステージとして表示される必要があります。

41
4J41

4J41の回答にあるように、_$group_は(直接)インデックスを使用しませんが、_$sort_は、パイプラインの最初のステージの場合は使用します。ただし、_$group_が_$sort_の直後にある場合は、原則として_$sort_が最適化された実装を持つ可能性があります。その場合、__(SOMECODE) )__事前に。

_$group_にこの最適化があるかどうかについてのドキュメントには、どちらの方法でも簡単な答えはないようです(そうした場合はあると思いますが、そうではないためです)。回答は MongoDBバグ4507 にあります。現在、_$group_にはこの実装がないため、4J41の回答の最初の行は結局正しいです。本当に効率が必要な場合は、アプリケーションによっては、通常のクエリを使用してクライアントコードでグループ化するのが最も速い場合があります。

編集:セバスチャンの答えが言うように、実際には_$sort_の前に_$group_(インデックスを利用できる)を使用すると、速度が大幅に向上するようです。上記のバグはまだ開いているため、インデックスの利点を最大限に生かしているようには見えません(つまり、アイテムをすべてメモリに最初にロードするのではなく、ロード時にアイテムのグループ化を開始します)。しかし、それは確かにやる価値があります。

3
Arthur Tacca

@ ArthurTacca、Mongo 4.0以降$sort$groupは物事を大幅にスピードアップします。 https://stackoverflow.com/a/56427875/92049 を参照してください。

1
sebastian

バージョン3.2で変更:MongoDB 3.2以降、インデックスは集約パイプラインをカバーできます。 MongoDB 2.6および3.0では、パイプラインがインデックスを使用する場合でも、集計は実際のドキュメントへのアクセスを必要とするため、インデックスは集計パイプラインをカバーできませんでした。

https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes

1
Oleg