Docs Menu

Docs Homeアプリケーションの開発Python ドライバーPyMongo

グループと合計

項目一覧

  • はじめに
  • 集計タスクの概要
  • 始める前に
  • Tutorial
  • 2020 年注文の一致ステージを追加します
  • 注文日で並べ替えるソートステージを追加
  • メールアドレスでグループ化するためのグループステージの追加
  • 最初の注文日でソートするためにソートステージを追加する
  • メールアドレスを表示するために設定ステージを追加します
  • 不要なフィールドを削除するために設定されていない ステージを追加します
  • 集計パイプラインの実行
  • 結果の解釈

このチュートリアルでは、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)
1

まず、 2020の注文に一致する $matchステージを追加します。

pipeline.append({
"$match": {
"orderdate": {
"$gte": datetime(2020, 1, 1, 0, 0, 0),
"$lt": datetime(2021, 1, 1, 0, 0, 0)
}
}
})
2

次に、 $sortステージを追加して、 orderdateフィールドで昇順の並べ替えを設定し、次のステージで各カスタマーの最も近い2020の購入を表示します。

pipeline.append({
"$sort": {
"orderdate": 1
}
})
3

Add a $group stage to group orders by the value of the customer_id field. このステージでは、結果ドキュメントに次のフィールドを作成する集計操作を追加します。

  • 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"}}
}
})
4

次に、別の$sortステージを追加して、 first_purchase_dateフィールドで昇順の並べ替えを設定します。

pipeline.append({
"$sort": {
"first_purchase_date": 1
}
})
5

$setステージを追加して、 $groupステージ中に設定された_idフィールドの値からcustomer_idフィールドを再作成します。

pipeline.append({
"$set": {
"customer_id": "$_id"
}
})
6

最後に、 $unsetステージを追加します。 $unsetステージでは、結果ドキュメントから_idフィールドが削除されます。

pipeline.append({"$unset": ["_id"]})
7

次のコードをアプリケーションの末尾に追加して、 ordersコレクションで集計を実行します。

aggregation_result = orders_coll.aggregate(pipeline)

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

python3 agg_tutorial.py
8

この集計により、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」を参照してください。 .

← フィルタリングされたサブセット