2016-11-03 15 views
1

私たちのバージョンのほとんどはMongodbにあります。次のように選択したバージョン管理メカニズムは次のとおりです。MongoDB集約クエリが非常に遅いです

{ "docId" : 174, "v" : 1, "attr1": 165 } /*version 1 */ 
{ "docId" : 174, "v" : 2, "attr1": 165, "attr2": "A-1" } 
{ "docId" : 174, "v" : 3, "attr1": 184, "attr2" : "A-1" } 

だから、私たちは私たちのクエリを実行するとき、我々は常に我々のオブジェクトの取得最新バージョンを確保するために、このように集約フレームワークを使用する必要があります。

db.docs.aggregate([ 
    {"$sort":{"docId":-1,"v":-1}}, 
    {"$group":{"_id":"$docId","doc":{"$first":"$$ROOT"}}} 
    {"$match":{<query>}} 
]); 

このアプローチの問題は、グループ化を済ませた後に、コレクション内のデータとは何も関係がないため、インデックスを使用できないということです。

結果として、コレクションのドキュメントが多いほどクエリが遅くなります。

これをスピードアップする方法はありますか?

ない場合、私はこの良い記事で定義されたアプローチの一つに移動することを検討するには:1つのコレクションの最新バージョンを保持し、1:http://www.askasya.com/post/trackversions/

+0

なぜ最初の段階で$一致していないのですか? –

+0

ドキュメントのdocIdフィールドにインデックスを追加します。 –

+0

@DanieleTassone私はそれがオプションではないかと恐れています。説明は私が提供したリンクにあります。基本的には、最初にフィルタをかけると、最新ではないバージョンになりますが、ソートグループのフェーズではそのように見なされます。このようなバージョニングを実行する際によくあるエラーです。 – jbernal

答えて

0

はちょうどこの質問を完了するために、我々は、オプション3と一緒に行きました歴史的なものを保つためのコレクション。ここに紹介されています:http://www.askasya.com/post/trackversions/といくつかの詳細な説明(素敵なコードスニペット付き)はhttp://www.askasya.com/post/revisitversions/にあります。

これは6ヶ月間稼働しています。ここまでは順調ですね。以前のアプローチでは、元のスキーマ($ group、$ project ...を使用)を元のコレクションと変更した直後にインデックスから離れていく集約フレームワークを常に使用していました。これは、データが増えている中で、私たちのパフォーマンスがひどくなっていました。

新しいアプローチでは問題はなくなりましたが、クエリの90%は最新のデータと照らし合わせてあり、これは識別子として単純なObjectIdのコレクションを対象としており、これ以上の集約フレームワークを必要とせず、通常の検索だけです。過去のデータに対する

私たちのクエリはいつも(私たちは、箱から出して、それを得るの両方_idとして我々が含まれます)これらのインデックスを作成することにより、idversionを含め、これらのコレクションは均等に高速である方に読み込みます。これは、見逃してはいけない点です。 MongoDBでコレクション/スキーマをどのように見せるかを設計するときは、アプリケーションのパターンを読むことが重要です。そのような意思決定を行う際には、その知識を確実に理解する必要があります。

関連する問題