集計
集計フレームワーク操作によりデータ レコードが処理され、計算結果が返されます。 集計操作は複数のドキュメントの値をまとめてグループ化し、グループ化されたデータに対してさまざまな操作を実行して 1 つの結果を返すことができます。
集計パイプライン
集計パイプラインは、データ処理パイプラインの概念をモデル化したデータ集計のフレームワークです。 ドキュメントは、ドキュメントを集計結果に変換するマルチステージ パイプラインに投入されます。
パイプライン ステージと演算子の完全な説明と完全なリストについては、マニュアルを参照してください。
次の例では、 restaurants
サンプル データセットの集計パイプラインを使用して、レストランのカテゴリ別にグループ化された 5 つ目レストランの総数のリストを検索します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.aggregate([ { '$match'=> { 'stars'=> 5 } }, { '$unwind'=> '$categories'}, { '$group'=> { '_id'=> '$categories', 'fiveStars'=> { '$sum'=> 1 } } } ]) aggregation.each do |doc| #=> Yields a BSON::Document. end
aggregate
メソッド内の最初のパイプライン ステージは、 stars
フィールドに5
を持つドキュメントを 除く すべてのドキュメントを除外します。 2 番目の ステージでは、配列であるcategories
フィールドを展開し、配列内の各項目を個別のドキュメントとして扱います。 3 つ目の ステージでは、ドキュメントをカテゴリ別にグループ化し、一致する 5 つ目の結果の数を合計します。
集計パイプライン ステージには最大メモリ使用量の制限があります。 大規模なデータセットを処理するには、 allowDiskUse
オプションを true に設定して一時ファイルへのデータの書込みを有効にします。
オプションが設定された新しいオブジェクトを取得するには、
allow_disk_use
メソッドをaggregation
オブジェクトで呼び出します。
aggregation = coll.aggregate([ <aggregration pipeline expressions> ]) aggregation_with_disk_use = aggregation.allow_disk_use(true)
または、
aggregate
メソッドにオプションを渡します。
aggregation = coll.aggregate([ <aggregration pipeline expressions> ], :allow_disk_use => true)
単目的集計操作
MongoDB は、 countやdistinct などの一部の集計関数のヘルパー メソッドを提供します。
数
次の例では、 count
メソッドを使用して、 categories
フィールドに正確な配列[ 'Chinese', 'Seafood' ]
を持つドキュメントの合計数を見つける方法を示しています。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.count({ 'categories': [ 'Chinese', 'Seafood' ] }) count = coll.count({ 'categories' => [ 'Chinese', 'Seafood' ] })
注意
count
メソッドはcountDocuments
メソッドと同じではなく、同じフィルタをサポートしていない可能性があります。countDocuments
$match
は、集計パイプラインの ステージを使用してドキュメントをフィルタリングします。$match
ステージの制限の詳細については、 MongoDB Serverマニュアルの $match 制限 を参照してください。
distinct
distinct
ヘルパー メソッドは、 値を含む結果を排除し、一意の値ごとに 1 つのレコードを返します。
次の例では、 restaurants
コレクション内のcategories
フィールドの一意の値のリストを返します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.distinct('categories') aggregation.each do |doc| #=> Yields a BSON::Document. end