Docs Menu
Docs Home
/ / /
Ruby MongoDB ドライバー
/

集計

項目一覧

  • 集計パイプライン
  • 単目的集計操作
  • distinct

集計フレームワーク操作によりデータ レコードが処理され、計算結果が返されます。 集計操作は複数のドキュメントの値をまとめてグループ化し、グループ化されたデータに対してさまざまな操作を実行して 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 は、 countdistinct などの一部の集計関数のヘルパー メソッドを提供します。

次の例では、 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' ] })

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

戻る

プロジェクション