aggregateコマンドを使用した集計操作には次の制限があります。
結果サイズの制限
コマンドは、カーソルを返すか、結果をコレクションに保存できますaggregate 。結果セット内の各ドキュメントには、16 メビバイトのBSONドキュメント サイズ の制限 が適用されます。いずれかのドキュメントがBSONドキュメント サイズ の制限を超えると、集計でエラーが発生します。この制限は、戻されたドキュメントにのみ適用されます。 パイプライン処理中に、ドキュメントがこのサイズを超える場合があります。 db.collection.aggregate()メソッドはデフォルトでカーソルを返します。
ステージ数の制限
MongoDBは、単一のパイプラインで許可される集計パイプラインステージの数を 1000 に制限します。
集計パイプラインが解析される前または解析された後に ステージの制限を超えると、エラーが発生します。
メモリ制限
MongoDB 6.0 以降のバージョンでは、実行に 100 MB を超えるメモリを必要とするパイプライン ステージが、デフォルトで一時ファイルをディスクに書き込むかどうかをallowDiskUseByDefaultパラメーターが制御します。
allowDiskUseByDefaultがtrueに設定されている場合、実行に 100 MB を超えるメモリを必要とするパイプライン ステージは、デフォルトで一時ファイルをディスクに書き込みます。{ allowDiskUse: false }オプションを使用して、特定のfindまたはaggregateコマンドの一時ファイルのディスクへの書き込みを無効にすることができます。allowDiskUseByDefaultがfalseに設定されている場合、実行に 100 MB を超えるメモリを必要とするパイプライン ステージでは、デフォルトでエラーが発生します。{ allowDiskUse: true }オプションを使用して、特定のfindまたはaggregateの一時ファイルのディスクへの書き込みを有効にすることができます。
$search 集計ステージは別のプロセスで実行されるため、 RAM の 100 メガバイトに制限されません。
allowDiskUse が true の場合に一時ファイルをディスクに書き込むことができるステージの例は次のとおりです。
$sortソート操作がインデックスでサポートされていない場合
注意
パイプライン ステージはドキュメントのストリームに対して動作し、各パイプライン ステージはドキュメントを取り込んで処理し、その結果となるドキュメントを出力します。
一部のステージでは、受信したドキュメントをすべて処理するまでドキュメントを出力できません。これらのパイプライン ステージは、すべての受信ドキュメントが処理されるまで、ステージ出力を RAM に保持する必要があります。その結果、これらのパイプライン ステージでは 100 MB の制限を超えるスペースが必要になる場合があります。
$sortパイプライン ステージのいずれかの結果が制限を超える場合は、$limit ステージの追加を検討してください。
ステージごとの制限に加えて、単一の操作は操作ごとのメモリ制限を超えるメモリを使用することはできません。
プロファイラーのログ メッセージと診断ログ メッセージには、メモリの制限により集計ステージが一時ファイルにデータが書き込まれた場合、usedDisk インジケーターが含められます。
操作ごとのメモリ制限
MongoDB 9.0 以降、 MongoDB は1 回のクエリ操作で使用できるメモリの合計量を制限します。制限は、操作のすべてのメモリ追跡ステージの合計メモリに適用されます。
追跡メモリには、次のものが含まれます。
式評価
地理空間近接検索やインデックスを使用するカウント、更新などのレコードをバッファするクエリ実行ステージ
デフォルトでは 、制限は 1 ギガバイトまたはサーバープロセスで使用可能なメモリの 20% のいずれか大きい方です。 MongoDB は、サーバーの起動時にデフォルトを設定します。
操作ごとの制限は、ステージあたり100 メガバイトのメモリ制限とは別であり、ステージがディスクにスピルする方法は変更されません。ステージごとの制限の詳細については、「 メモリ制限 」を参照してください。
操作が操作ごとの制限を超えると、 MongoDB は操作を終了し、次のいずれかのエラーを返します。
QueryExceededMemoryLimitNoDiskUseAllowedallowDiskUsefalseディスクに書き出すことができるステージが制限を超え、 が の場合は 。 で操作を実行し、{ allowDiskUse: true }ステージが失敗するのではなくディスクに流出させます。ExceededMemoryLimit制限を超える他の操作の場合。
ほとんどの操作は 制限よりもはるかに少なくなメモリを使用します。操作によってメモリ制限エラーが返される場合は、次のアクションの 1 つ以上を実行して操作に必要なメモリを減らします。
MongoDB がメモリ内のドキュメントをソートしないように、ソートを満たすためにインデックスを使用します。詳細については、「 ソートとインデックスの使用 」を参照してください。
$limitステージの後に$sortステージを追加して、並べ替えに必要なドキュメントのみが保持されるようにします。詳細については、「 $sort と $limit メモリの最適化 」を参照してください。パイプラインの早い段階で
$matchを使用してドキュメントをフィルタリングし、後のステージで処理されるドキュメントを少なくします。詳しくは、「 集計パイプラインの最適化 」を参照してください。
各操作ごとのメモリ使用量を確認するには、次のserverStatus メトリクスを使用します。