web-dev-qa-db-ja.com

MongoDB集計の比較:group()、$ groupおよびMapReduce

$ groupまたはmapreduceでgroup()、aggregateをいつ使用するかについて少し混乱しています。私は http://www.mongodb.org/display/DOCS/Aggregation for group()でドキュメントを読みます http://docs.mongodb.org/manual/reference/ Aggregation/group /#_ S_group for $ group .. group()が機能しない唯一の状況はシャーディングですか?また、$ groupは集約フレームワークの他のパイプライン演算子と組み合わせて使用​​できるため、group()よりも$ groupの方が強力であると感じています。$ groupはmapreduceとどのように比較されますか? mapreduceが生成するのに対し、一時的なコレクションは生成しないことをどこかで読みました。そうですか?
同じサンプルデータを使用して、誰かがイラストを提示したり、これら3つの概念が一緒に説明されているリンクに案内されたりして、簡単に比較できるようにできますか?

編集:
また、新しい2.2リリースがリリースされて以来、これらのコマンドで特に何か新しい点を指摘できればすばらしいと思います。

39
Aafreen Sheikh

名前は似ているので多少混乱しますが、 group() command_$group_パイプライン演算子 とは異なる機能および実装です集約フレームワーク。

Group()コマンド、Aggregation Framework、およびMapReduceは、MongoDBの集合集合機能です。機能にはいくつかの重複がありますが、MongoDB 2.2.0と同様に、それぞれの違いと制限について説明します。

注:下記のインライン結果セットは、メモリ内で処理され、関数呼び出しの最後に結果が返されるクエリを指します。別の出力オプション(現在はMapReduceでのみ使用可能)には、結果を新規または既存のコレクションに保存することが含まれます。

group()コマンド

  • SQLの_GROUP BY_に類似したグループ化のための単純な構文と機能。

  • 結果セットをインラインで(グループ化された項目の配列として)返します。

  • JavaScriptエンジンを使用して実装されます。カスタムreduce()関数はJavaScriptで記述できます。

  • 現在の制限

    • 20,000を超えるキーを持つ結果セットにグループ化されません。

    • 結果は、BSONドキュメント(現在16MB)の制限内に収まる必要があります。

    • 読み取りロックを取得し、実行中の他のスレッドがJavaScriptを実行することを許可しません。

    • シャードされたコレクションでは機能しません。

  • 参照:group()コマンドの例.

MapReduce

  • 大きなデータセットを処理するための MapReduceモデル を実装します。

  • 出力オプション (インライン、新しいコレクション、マージ、置換、削減)の1つから選択できます

  • MapReduce関数はJavaScriptで記述されています。

  • 非シャーディングおよびシャーディングされた入力コレクションをサポートします。

  • 大規模なコレクションの増分集計に使用できます。

  • MongoDB 2.2は sharded map reduce output のサポートを大幅に改善しています。

  • 現在の制限

    • 1つの出力は、MongoDBの最大BSONドキュメントサイズ(16MB)の半分しか保持できません。

    • JavaScriptロックがあるため、mongodサーバーは一度に1つのJavaScript関数しか実行できません。しかし、MapReduceのほとんどのステップは非常に短いため、ロックを頻繁に生成できます。

    • MapReduce関数はデバッグが難しい場合があります。 print()およびprintjson()を使用して、mongodログに診断出力を含めることができます。

    • MapReduceは、リレーショナルクエリ集約のエクスペリエンスを変換しようとするプログラマにとって、一般的に直感的ではありません。

  • 参照:Map/Reduceの例.

集約フレームワーク

  • MongoDB 2.2.0プロダクションリリースの新機能(2012年8月)。

  • パフォーマンスと使いやすさを向上させるという特定の目標に基づいて設計されています。

  • 結果セットをインラインで返します。

  • 非シャーディングおよびシャーディングされた入力コレクションをサポートします。

  • 「パイプライン」アプローチを使用して、マッチング、投影、並べ替え、グループ化などの一連のパイプライン演算子を通過するオブジェクトを変換します。

  • パイプラインオペレーターは、入力ドキュメントごとに1つの出力ドキュメントを生成する必要はありません。オペレーターは、新しいドキュメントを生成したり、ドキュメントをフィルターで除外したりすることもできます。

  • プロジェクションを使用すると、計算フィールドを追加したり、新しい仮想サブオブジェクトを作成したり、サブフィールドをトップレベルの結果に抽出したりできます。

  • パイプライン演算子は、必要に応じて繰り返すことができます(たとえば、複数の_$project_または_$group_ステップ)。

  • 現在の制限

    • 結果はインラインで返されるため、サーバーでサポートされる最大ドキュメントサイズ(16MB)に制限されます

    • MapReduceほど多くの出力オプションをサポートしていません

    • 演算子と式 に限定され、Aggregation Frameworkによってサポートされます(つまり、カスタム関数を作成できません)。

    • 集約のための最新のサーバー機能なので、ドキュメント、機能セット、および使用法の面で成熟する余地があります。

  • 参照:集約フレームワークの例.

誰かがイラストを提示したり、同じサンプルデータを使用してこれら3つの概念が一緒に説明されているリンクに案内されたりして、それらを簡単に比較できるようにできますか?

通常、3つのアプローチすべてを比較するのに役立つ例はありませんが、ここでは、バリエーションを示す以前のStackOverflowの質問を示します。

74
Stennie