名前が似ているので少し混乱しますが、group()
コマンドは、$group
とは異なる機能と実装です。 アグリゲーションフレームワークのパイプライン演算子。
group()コマンド、Aggregation Framework、およびMapReduceは、まとめて集約機能です。 MongoDBの。機能にはいくつかの重複がありますが、MongoDB2.2.0と同様にそれぞれの違いと制限について説明しようと思います。
注:インライン結果セット 以下で説明するのは、メモリ内で処理され、関数呼び出しの最後に結果が返されるクエリを指します。代替の出力オプション(現在はMapReduceでのみ使用可能)には、結果を新規または既存のコレクションに保存することが含まれる場合があります。
group()
コマンド
-
グループ化のための単純な構文と機能..
GROUP BY
に類似 SQLで。 -
結果セットをインラインで返します(グループ化されたアイテムの配列として)。
-
JavaScriptエンジンを使用して実装されています。カスタム
reduce()
関数はJavaScriptで記述できます。 -
現在の制限
-
20,000を超えるキーを含む結果セットにグループ化されません。
-
結果は、BSONドキュメント(現在16MB)の制限内に収まる必要があります。
-
読み取りロックを取得し、実行中に他のスレッドがJavaScriptを実行することを許可しません。
-
シャーディングされたコレクションでは機能しません。
-
-
参照: group()コマンドの例 。
MapReduce
-
大規模なデータセットを処理するためのMapReduceモデルを実装します。
-
いくつかの出力オプション(インライン、新しいコレクション、マージ、置換、削減)のいずれかから選択できます
-
MapReduce関数はJavaScriptで記述されています。
-
シャーディングされていない入力コレクションとシャーディングされた入力コレクションをサポートします。
-
大規模なコレクションの増分集計に使用できます。
-
MongoDB 2.2は、シャードマップリデュース出力のサポートを大幅に改善します。
-
現在の制限
-
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の質問は次のとおりです。
- group()とAggregation Framework
- MapReduceとAggregationFrameworkの比較