web-dev-qa-db-ja.com

MongoDB {aggregation $ match}対{find}速度

数百万行のmongoDBコレクションがあり、クエリを最適化しようとしています。現在、集計フレームワークを使用して、データを取得し、必要に応じてグループ化します。私の典型的な集約クエリは次のようなものです:$match > $group > $ group > $project

しかし、最後の部分は数ミリ秒しかかからず、開始は最も遅いことに気付きました。

$ matchフィルターのみでクエリを実行し、collection.findで同じクエリを実行しようとしました。集計クエリには約80msかかりますが、検索クエリには0または1msかかります。

私はほとんど各フィールドにインデックスを持っているので、これは問題ではないと思います。何がうまくいかないか考えていますか?それとも、集約フレームワークの単なる「通常の」欠点ですか?

集計クエリの代わりに検索クエリを使用することもできますが、リクエスト後に多くの処理を実行する必要があり、このプロセスは$groupなど。だから、むしろ集約フレームワークを維持したい。

おかげで、

編集:

私の基準は次のとおりです。

{
    "action" : "click",
    "timestamp" : {
            "$gt" : ISODate("2015-01-01T00:00:00Z"),
            "$lt" : ISODate("2015-02-011T00:00:00Z")
    },
    "itemId" : "5"
}
40
Owumaro

aggregation frameworkの主な目的は、多数のエントリのクエリを容易にし、価値を保持する少数の結果を生成することです。

既に述べたように、複数のfindクエリを使用することもできますが、findクエリを使用して新しいフィールドを作成することはできません。一方、$groupステージでは、新しいフィールドを定義できます。

aggregation frameworkの機能を実現したい場合は、最初のfind(または複数のチェーン)を実行し、その情報を引き出してプログラミング言語でさらに操作する必要があります。

aggregation pipelineは時間がかかるように思えるかもしれませんが、少なくとも1つのシステム(MongoDBエンジン)のパフォーマンスのみを考慮する必要があることを知っています。

一方、findクエリから返されたデータを操作する場合は、プログラミング言語を使用してデータをさらに操作する必要があるため、選択したプログラミング言語の複雑さに応じて複雑さが増します。

24
vladzam

Find()を使用して検索クエリを試しましたか? find()クエリが正確にどれくらいの時間を要するかについての良いアイデアを提供します。 $ explainを使用して$ matchでも同じことができ、インデックスアクセスと他のパラメーターに違いがあるかどうかを確認できます。

また、集計フレームワークの$ group部分はインデックス作成を利用しないため、集計フレームワークの$ matchステージによって返されるすべてのレコードを処理する必要があります。したがって、クエリの動作をよりよく理解するには、返される結果セットと、MongoDBで処理されるメモリに収まるかどうかを確認します。

7
harshad