group() をいつ使用するか、$group または mapreduce で集計するかについて、多少混乱しています。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 は mapreduce とどのように比較されますか? mapreduce が生成するのに対し、一時的なコレクションを生成しないことをどこかで読みました。そうですか?
簡単に比較できるように、同じサンプル データを使用して、これら 3 つの概念がまとめて説明されている図を示したり、リンクを案内したりできますか?
編集:
また、新しい 2.2 リリースがリリースされて以来、これらのコマンドで具体的に何か新しいことを指摘できれば、それは素晴らしいことです..
1 に答える
名前が似ているのでややこしいですが、このgroup()
コマンドはAggregation Frameworkの$group
パイプライン オペレーターとは異なる機能および実装です。
group() コマンド、Aggregation Framework、および MapReduce は、集合的に MongoDB の集約機能です。重複する機能もありますが、MongoDB 2.2.0 と同様に、それぞれの違いと制限を説明しようと思います。
注:以下で説明するインライン結果セットは、メモリ内で処理され、関数呼び出しの最後に結果が返されるクエリを指します。別の出力オプション (現在は MapReduce でのみ使用可能) には、結果を新規または既存のコレクションに保存することが含まれます。
group()
指示
GROUP BY
グループ化のための単純な構文と機能.. SQLに似ています。結果セットをインラインで (グループ化された項目の配列として) 返します。
JavaScript エンジンを使用して実装されています。カスタム
reduce()
関数は JavaScript で記述できます。現在の制限
20,000 を超えるキーを持つ結果セットにグループ化されません。
結果は、BSON ドキュメントの制限 (現在 16 MB) 内に収まる必要があります。
読み取りロックを取得し、実行中は他のスレッドが JavaScript を実行できないようにします。
シャード コレクションでは機能しません。
参照: group() コマンドの例.
MapReduce
大規模なデータ セットを処理するためのMapReduce モデルを実装します。
いくつかの出力オプション(インライン、新しいコレクション、マージ、置換、削減)のいずれかから選択できます。
MapReduce 関数は JavaScript で記述されています。
非シャーディングおよびシャーディングされた入力コレクションをサポートします。
大規模なコレクションの増分集計に使用できます。
MongoDB 2.2 では、分割されたmap reduce 出力のサポートが大幅に改善されています。
現在の制限
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 の質問を次に示します。