設定はありません。本当に考えれば、これには十分な理由があります。したがって、最初にaggregateが実行していることと、MongoDBが一般的に実行していることを検討すると、それが明らかになるはずです。
これが「すべき」 賢明な集約パイプラインの「先頭」にいる:
db.collection.aggregate([
{ "$match:{ /* Something here */ } },
そして、これらが理由です:
-
理にかなっている 試して 任意で操作しているワーキングセットを減らすため 操作。
-
これものみです 選択範囲の検索に役立つインデックスを使用する機会が得られます。これは常にです コレクションスキャンよりも優れています。
-
「オプティマイザー」が組み込まれていますが 「選択された」フィールドを制限する「プロジェクション」などを探す場合、ワーキングセットのサイズを精査するのに最適なのはのみです。 有効なレコードで作業します。後のステージの試合は「最適化」されていません このように(ポイント 1 を参照) )
次に考慮すべきことは、MongoDBの一般的な動作です。サーバープロセスが必要になるように 行うには、"消費" 多くとして 「作業」のために「作業セット」データ(コレクションおよび/またはインデックス)を保持するために、可能な限り使用可能なマシンメモリの 最も効率的な手段でそのデータに 。
つまり、本当に 「最善の利益」 ほとんどを「費やす」データベースエンジンの このようにメモリを割り当てます。そのように、両方の "aggregate" 仕事とすべてのその他 並行プロセスは、メモリ空間の「作業データ」にアクセスできます。
したがって、「最適ではない」 MongoDBが「盗む」 このメモリ割り当ては、他の同時操作から離れています 実行中の集計操作を処理します。
「ハードウェア要件へのプログラミング」 用語では、将来のリリースでは、より大規模な処理を可能にするために、集約パイプラインが「ディスク使用」を実装できるようになることをご存知でしょう。 SSDまたはその他の高速をいつでも実装できます ストレージテクノロジー。そしてもちろん"10%" RAMの量は、システムにインストールされているRAMの量に左右されます。したがって、いつでも増やすことができます それ。
まとめると、MongoDBには実際のジョブがあります 「同時データストア」であるということ そしてそれはうまくいきます。 そうではない 固有です 「アグリゲーションジョブランナー 「そしてそのように扱われるべきではありません。
つまり、 "break-up" ワークロード、または増加 ハードウェア仕様、または単に大規模な「タスク実行中」アクティビティを実行するものに切り替えます Hadoopスタイルなどの実行中のジョブに焦点を当てます 「mapReduce」を実行し、MongoDBをジョブに任せます データを提供します。
または、もちろん、デザインを単に "pre-aggregate"に変更します。 「書き込み中」のどこかに必要なデータ 。
ことわざにあるように、「コースの馬」 、またはツールを設計されたものに使用する 。