集計によるデータの変換
Overview
このガイドでは、 MongoDB PHPライブラリを使用して集計操作を実行する方法を学習できます。
集計操作により MongoDB コレクション内のデータが処理され、計算結果が返されます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、そこで集計結果に変換されます。
集計操作は自動車工場に似ています。工場内の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。
集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。
集計操作と検索操作
検索操作を使用して、次のアクションを実行できます。
どのドキュメントを返すかを選ぶ
どのフィールドを返すかを選ぶ
結果を並べ替える
集計操作を使用して、次のアクションを実行できます。
検索操作の実行
フィールドの名前を変更する
フィールドを計算する
データを要約する
値をグループ化する
制限
集計操作を実行する際には、次の制限を考慮してください。
返されたドキュメントは、 BSONドキュメントサイズの制限である16メガバイトに違反することはできません。
パイプライン ステージには、デフォルトで100メガバイトのメモリ制限があります。 この制限を超えるには、
allowDiskUse
オプションをtrue
に設定するオプション配列を作成し、その配列をMongoDB\Collection::aggregate()
メソッドに渡します。
集計の例
注意
このガイドの例では、 Atlas サンプル データセットのsample_restaurants
データベースのrestaurants
コレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。
集計を実行するには、パイプラインステージを含む配列をMongoDB\Collection::aggregate()
メソッドに渡します。
次のコード例では、ニューヨークの各地区のケーキの数のカウントを生成します。 そのために、次のステージを含む集計パイプラインを使用します。
$matchステージ
cuisine
フィールドに値'Bakery'
が含まれるドキュメントをフィルタリングします。$groupステージでは、一致するドキュメントを
borough
フィールドでグループ化し、個別の 値ごとにドキュメントの数を蓄積します
$pipeline = [ ['$match' => ['cuisine' => 'Bakery']], ['$group' => ['_id' => '$borough', 'count' => ['$sum' => 1]]], ]; $cursor = $collection->aggregate($pipeline); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":"Brooklyn","count":173} {"_id":"Queens","count":204} {"_id":"Bronx","count":71} {"_id":"Staten Island","count":20} {"_id":"Missing","count":2} {"_id":"Manhattan","count":221}
集計の説明
MongoDBが操作を実行する方法に関する情報を表示するには、 MongoDBクエリ プランナーにそれを説明するように指示できます。 MongoDBが操作を説明すると、実行プランとパフォーマンス統計が返されます。 実行プランは、 MongoDBが操作を完了できる潜在的な方法です。 MongoDBに操作を説明するように指示すると、 MongoDBが実行したプランと拒否された実行プランの両方が返されます。
集計操作を説明するには、 MongoDB\Operation\Aggregate
オブジェクトを作成し、データベース、コレクション、パイプラインステージをパラメーターとして渡します。 次に、 MongoDB\Operation\Aggregate
オブジェクトをMongoDB\Collection::explain()
メソッドに渡します。
次の例では、 MongoDBに、前述の集計の例の集計操作を説明するように指示します。
$pipeline = [ ['$match' => ['cuisine' => 'Bakery']], ['$group' => ['_id' => '$borough', 'count' => ['$sum' => 1]]], ]; $aggregate = new MongoDB\Operation\Aggregate( $collection->getDatabaseName(), $collection->getCollectionName(), $pipeline ); $result = $collection->explain($aggregate); echo json_encode($result), PHP_EOL;
{"explainVersion":"2","queryPlanner":{"namespace":"sample_restaurants.restaurants", "indexFilterSet":false,"parsedQuery":{"cuisine":{"$eq":"Bakery"}},"queryHash":"865F14C3", "planCacheKey":"D56D6F10","optimizedPipeline":true,"maxIndexedOrSolutionsReached":false, "maxIndexedAndSolutionsReached":false,"maxScansToExplodeReached":false,"winningPlan":{ ... }
詳細情報
MongoDB PHPライブラリを使用して複雑な集計パイプラインを作成するチュートリアルについては、 MongoDB Developer Center の「 MongoDB Ops PHPとMongoDBを使用した複雑な集計パイプライン 」を参照してください。
MongoDB Server マニュアル
このガイドで説明されているトピックについて詳しくは、 MongoDB Serverマニュアルの次のページ を参照してください。
式演算子の完全なリストを表示するには、「集計演算子 」を参照してください。
集計パイプラインの組み立てと例については、「集計パイプライン 」を参照してください。
パイプライン ステージの作成の詳細については、「集計ステージ 」を参照してください。
MongoDB 操作の説明の詳細については、「出力とクエリ プランの説明 」を参照してください。
API ドキュメント
このガイドで説明されているメソッドの詳細については、次のAPIドキュメントを参照してください。