Overview
このガイドでは、PyMongo を使用して集計操作を実行する方法を学習できます。
集計操作により MongoDB コレクション内のデータが処理され、計算結果が返されます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、そこで集計結果に変換されます。
集計操作は自動車工場に似ています。工場内の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。
集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。
Tip
完全な集計チュートリアル
集計操作と検索操作
検索操作を使用して、次のアクションを実行できます。
どのドキュメントを返すかを選ぶ
どのフィールドを返すかを選ぶ
結果を並べ替える
集計操作を使用して、次のアクションを実行できます。
検索操作の実行
フィールドの名前を変更する
フィールドを計算する
データを要約する
値をグループ化する
制限
集計操作を使用するときは、次の制限に注意してください。
返されるドキュメントは、 メガバイトのBSONドキュメントサイズ 16制限に違反していない必要があります。
パイプライン ステージには、デフォルトで100 MB のメモリ制限があります。 この制限を超えるには、
aggregate()メソッドのallowDiskUseキーワード引数を使用します。
集計の例
注意
この例では、 Atlas サンプル データセットのsample_restaurants.restaurantsコレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 PyMongo を使い始める 」を参照してください。
集計を実行するには、集計ステージのリストを collection.aggregate() メソッドに渡します。
次のコード例では、ニューヨークの各地区のケーキの数のカウントを生成します。 そのために、次のステージを持つ集計パイプラインを使用します。
$match ステージで、
cuisineフィールドに値"Bakery"が含まれるドキュメントをフィルタリングします。
対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the aggregation aggCursor = collection.aggregate(pipeline) # Print the aggregated results for document in aggCursor: print(document)
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the aggregation aggCursor = await collection.aggregate(pipeline) # Print the aggregated results async for document in aggCursor: print(document)
上記のコード例では、次のような出力が生成されます。
{'_id': 'Bronx', 'count': 71} {'_id': 'Brooklyn', 'count': 173} {'_id': 'Missing', 'count': 2} {'_id': 'Manhattan', 'count': 221} {'_id': 'Queens', 'count': 204} {'_id': 'Staten Island', 'count': 20}
集計の説明
MongoDB が操作を実行する方法に関する情報を表示するには、それを説明するように MongoDB に指示できます。 MongoDB が操作を説明すると、実行プランとパフォーマンス統計が返されます。 実行プランは、MongoDB が操作を完了できる潜在的な方法です。 MongoDB に操作を説明するように指示すると、MongoDB が実行したプランと拒否された実行プランの両方が返されます。
集計操作を説明するには、PyMongoExplain ライブラリまたはデータベースコマンドのいずれかを使用できます。各方法の例を表示するには、以下の対応するタブを選択します。
次の例に示すように、 pip を使用してpymongoexplainライブラリをインストールします。
python3 -m pip install pymongoexplain
次のコード例では、前述の集計の例を実行し、MongoDB によって返された説明を出力します。
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the operation and print the explanation result = ExplainableCollection(collection).aggregate(pipeline) print(result)
... 'winningPlan': {'queryPlan': {'stage': 'GROUP', 'planNodeId': 3, 'inputStage': {'stage': 'COLLSCAN', 'planNodeId': 1, 'filter': {'cuisine': {'$eq': 'Bakery'}}, 'direction': 'forward'}}, ...
次のコード例では、前述の集計の例を実行し、MongoDB によって返された説明を出力します。
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { $match: { cuisine: "Bakery" } }, { $group: { _id: "$borough", count: { $sum: 1 } } } ] # Execute the operation and print the explanation result = database.command("aggregate", "collection", pipeline=pipeline, explain=True) print(result)
... 'command': {'aggregate': 'collection', 'pipeline': [{'$match': {'cuisine': 'Bakery'}}, {'$group': {'_id': '$borough', 'count': {'$sum': 1}}}], 'explain': True, ...
Tip
Python のpprintモジュールを使用すると、説明結果を読みやすくできます。
import pprint ... pprint.pp(result)
詳細情報
MongoDB Server マニュアル
集計ステージの完全なリストについては、MongoDB Serverマニュアルの集計ステージを参照してください。
集計パイプラインの組み立てと例については、「集計パイプライン 」を参照してください。
MongoDB 操作の説明の詳細については、「出力とクエリ プランの説明 」を参照してください。
API ドキュメント
PyMongo を使用して集計操作を実行する方法の詳細については、次の API ドキュメントを参照してください。