2016-06-14 13 views
4

返されたdocが集計で16MBの制限を超える場合、allowDiskUseオプションを使用する必要がありますか?製品環境で「allowDiskUse」オプションを使用する必要がありますか?

制限を回避するためにDB構造またはコードロジックを変更する必要がありますか? 'allowDiskUse'のメリットとデメリットは何ですか? ご協力いただきありがとうございます。バージョン2.6で変更 結果のサイズ制限

ハーズは、私が見てきた公式のドキュメントです。

MongoDB 2.6以降、aggregateコマンドはカーソルを返すか、結果をコレクションに格納できます。カーソルを返すか、または結果をコレクションに格納するとき、結果セットの各ドキュメントはBSONドキュメントサイズの制限に従います(現在は16メガバイトです)。 BSONのドキュメントサイズ制限を超える単一のドキュメントがある場合、コマンドはエラーを生成します。この制限は、返される文書にのみ適用されます。パイプライン処理中に文書がこのサイズを超えることがあります。

メモリの制限¶

バージョン2.6で変更されました。

パイプラインステージのRAMの上限は100 MBです。ステージがこの制限を超えると、MongoDBはエラーを生成します。大きなデータセットの処理を可能にするには、allowDiskUseオプションを使用して集約パイプラインステージでデータを一時ファイルに書き込むことができます。 https://docs.mongodb.com/manual/core/aggregation-pipeline-limits/

答えて

6

allowDiskUseは、16MBの結果サイズの制限とは関係ありません。この設定は、$ sortや$ groupなどのパイプラインステップで、100MBを超えるメモリが必要な場合に一時的なディスクスペースを使用できるかどうかを制御します。理論的には、任意のパイプラインに対して、これは非常に大量のディスクスペースになる可能性があります。個人的にはそれほど問題はありませんが、それはあなたのデータになります。

結果が16MBを超える場合は、$ outパイプラインステージを使用してデータをコレクションに出力するか、すべてのデータをインラインで返す代わりにカーソルを結果に返すパイプラインAPIを使用する必要がありますいくつかのドライバではこれは別のメソッドですが、他のドライバでは同じメソッドに渡されるフラグです)。

+0

他のコレクションにデータを出力すると(> 16MB)、コレクションからデータを取得するにはどうすればいいのですか?もう1つのクエリはdb.collection.find()を使用して取得できますか? – Leo

+0

はい、別にそれを照会する必要があります –

+0

初めて「集約」ではなく「find()」を使用するとどうなりますか?効率について何か?私の非常に多くの質問には申し訳ありません。 >< – Leo

関連する問題