グループと合計
項目一覧
はじめに
このチュートリアルでは、PyMongo を使用して集計パイプラインを構築し、コレクションに対して集計を実行し、サンプル アプリを完了して実行して結果を出力する方法を学習できます。 この集計では、次の操作が実行されます。
フィールド値でドキュメントのサブセットと一致
ドキュメントを共通のフィールド値でグループ化
各結果ドキュメントに計算フィールドを追加します
集計タスクの概要
このチュートリアルでは、カスタマーの注文データをグループ化して分析する方法を説明します。 結果には、2020 年に商品を購入したカスタマーのリストが表示され、2020 年における各カスタマーの注文履歴が含まれています。
この例では、個々の製品の注文を説明するドキュメントを含む 1 つのコレクション orders
を使用します。 各注文は 1 人のカスタマーのみに対応できるため、注文ドキュメントはカスタマーのメールアドレスを含むcustomer_id
フィールドでグループ化されます。
始める前に
このチュートリアルを開始する前に、 集計テンプレートアプリの手順を完了して、動作する Python アプリケーションを設定してください。
アプリを設定したら、次のコードをアプリケーションに追加してorders
コレクションにアクセスします。
orders_coll = agg_db["orders"]
次のコードに示すように、既存の データを削除し、サンプル データをorders
コレクションに挿入します。
orders_coll.delete_many({}) order_data = [ { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 5, 30, 8, 35, 52), "value": 231 }, { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 1, 13, 9, 32, 7), "value": 99 }, { "customer_id": "oranieri@warmmail.com", "orderdate": datetime(2020, 1, 1, 8, 25, 37), "value": 63 }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2019, 5, 28, 19, 13, 32), "value": 2 }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2020, 11, 23, 22, 56, 53), "value": 187 }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2020, 8, 18, 23, 4, 48), "value": 4 }, { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 12, 26, 8, 55, 46), "value": 4 }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2021, 2, 28, 7, 49, 32), "value": 1024 }, { "customer_id": "elise_smith@myemail.com", "orderdate": datetime(2020, 10, 3, 13, 49, 44), "value": 102 } ] orders_coll.insert_many(order_data)
Tutorial
2020 年注文の一致ステージを追加します
まず、 2020の注文に一致する $matchステージを追加します。
pipeline.append({ "$match": { "orderdate": { "$gte": datetime(2020, 1, 1, 0, 0, 0), "$lt": datetime(2021, 1, 1, 0, 0, 0) } } })
注文日で並べ替えるソートステージを追加
次に、 $sortステージを追加して、 orderdate
フィールドで昇順の並べ替えを設定し、次のステージで各カスタマーの最も近い2020の購入を表示します。
pipeline.append({ "$sort": { "orderdate": 1 } })
メールアドレスでグループ化するためのグループステージの追加
$groupステージを追加して、 customer_id
フィールドの値で注文をグループ化します。 このステージでは、結果ドキュメントに次のフィールドを作成する集計操作を追加します。
first_purchase_date
: カスタマーの最初の購入日total_value
: すべてのカスタマーの売上合計値total_orders
: カスタマーの購入合計数orders
: 各購入の日付と金額を含む、すべてのカスタマーの購入のリスト
pipeline.append({ "$group": { "_id": "$customer_id", "first_purchase_date": {"$first": "$orderdate"}, "total_value": {"$sum": "$value"}, "total_orders": {"$sum": 1}, "orders": {"$push": {"orderdate": "$orderdate", "value": "$value"}} } })
最初の注文日でソートするためにソートステージを追加する
次に、別の$sortステージを追加して、 first_purchase_date
フィールドで昇順の並べ替えを設定します。
pipeline.append({ "$sort": { "first_purchase_date": 1 } })
メールアドレスを表示するために設定ステージを追加します
$setステージを追加して、 $group
ステージ中に設定された_id
フィールドの値からcustomer_id
フィールドを再作成します。
pipeline.append({ "$set": { "customer_id": "$_id" } })
不要なフィールドを削除するために設定されていない ステージを追加します
最後に、 $unsetステージを追加します。 $unset
ステージでは、結果ドキュメントから_id
フィールドが削除されます。
pipeline.append({"$unset": ["_id"]})
結果の解釈
この集計により、2020 年からのカスタマーの注文に関する次の概要が返されます。
{ 'first_purchase_date': datetime.datetime(2020, 1, 1, 8, 25, 37), 'total_value': 63, 'total_orders': 1, 'orders': [ { 'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63 } ], 'customer_id': 'oranieri@warmmail.com' } { 'first_purchase_date': datetime.datetime(2020, 1, 13, 9, 32, 7), 'total_value': 436, 'total_orders': 4, 'orders': [ { 'orderdate': datetime.datetime(2020, 1, 13, 9, 32, 7), 'value': 99 }, { 'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 231 }, { 'orderdate': datetime.datetime(2020, 10, 3, 13, 49, 44), 'value': 102 }, { 'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 4 } ], 'customer_id': 'elise_smith@myemail.com' } { 'first_purchase_date': datetime.datetime(2020, 8, 18, 23, 4, 48), 'total_value': 191, 'total_orders': 2, 'orders': [ { 'orderdate': datetime.datetime(2020, 8, 18, 23, 4, 48), 'value': 4 }, { 'orderdate': datetime.datetime(2020, 11, 23, 22, 56, 53), 'value': 187 } ], 'customer_id': 'tj@wheresmyemail.com' }
結果ドキュメントには、特定のカスタマーからのすべての注文の詳細が、カスタマーのメールアドレス別にグループ化されて含まれます。
このチュートリアルの完全なコードを表示するには、 Githubの 完了したグループと合計アプリ Githubを参照してください。