Docs Menu

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

配列とグループを解凍

項目一覧

  • はじめに
  • 集計タスクの概要
  • 始める前に
  • Tutorial
  • 製品注文の配列を解凍するために展開ステージを追加します
  • 15 ドルを超えるコストの製品に一致するステージを追加する
  • 製品タイプ別にグループ化するためのグループ ステージを追加します
  • 製品 ID を表示するためにセット ステージを追加します
  • 不要なフィールドを削除するために設定されていない ステージを追加します
  • 集計パイプラインの実行
  • 結果の解釈

このチュートリアルでは、PyMongo を使用して集計パイプラインを構築し、コレクションに対して集計を実行し、サンプル アプリを完了して実行して結果を出力する方法を学習できます。 この集計では、次の操作が実行されます。

  • 配列フィールドを個別のドキュメントに展開

  • フィールド値でドキュメントのサブセットと一致

  • ドキュメントを共通のフィールド値でグループ化

  • 各結果ドキュメントに計算フィールドを追加します

このチュートリアルでは、カスタマーの注文データからインサイトを作成する方法を説明します。 結果は、コストが $15 を超える注文された製品のリストを示し、各ドキュメントには各製品の販売ユニット数と合計売上額が含まれています。

この例では、製品の注文を説明するドキュメントを含む 1 つのコレクション ordersを使用します。 各注文には複数の製品が含まれているため、集計の最初のステップはproducts配列を個々の製品注文ドキュメントに解凍します。

このチュートリアルを開始する前に、集計テンプレートアプリの手順を完了して、動作する Python アプリケーションを設定してください。

アプリを設定したら、次のコードをアプリケーションに追加してordersコレクションにアクセスします。

orders_coll = agg_db["orders"]

次のコードに示すように、既存の データを削除し、サンプル データをordersコレクションに挿入します。

orders_coll.delete_many({})
order_data = [
{
"order_id": 6363763262239,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 22,
},
]
},
{
"order_id": 1197372932325,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 429,
}
]
},
{
"order_id": 9812343774839,
"products": [
{
"prod_id": "pqr88223",
"name": "Morphy Richards Food Mixer",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 21,
}
]
},
{
"order_id": 4433997244387,
"products": [
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 23,
},
{
"prod_id": "jkl77336",
"name": "Picky Pencil Sharpener",
"price": 1,
},
{
"prod_id": "xyz11228",
"name": "Russell Hobbs Chrome Kettle",
"price": 16,
}
]
}
]
orders_coll.insert_many(order_data)
1

まず、 $unwindステージを追加して、 products配列のエントリを個々のドキュメントに分割します。

pipeline.append({
"$unwind": {
"path": "$products"
}
})
2

次に、 products.priceの値が15より大きい製品に一致する$matchステージを追加します。

pipeline.append({
"$match": {
"products.price": {
"$gt": 15
}
}
})
3

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

  • product: 製品名

  • total_value: 製品の全売上の合計値

  • quantity: 製品の注文数

pipeline.append({
"$group": {
"_id": "$products.prod_id",
"product": {"$first": "$products.name"},
"total_value": {"$sum": "$products.price"},
"quantity": {"$sum": 1}
}
})
4

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

pipeline.append({
"$set": {
"product_id": "$_id"
}
})
5

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

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

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

aggregation_result = orders_coll.aggregate(pipeline)

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

python3 agg_tutorial.py
7

この集計により、2020 年からのカスタマーの注文に関する次の概要が返されます。

{
'product': 'Asus Laptop',
'total_value': 860,
'quantity': 2,
'product_id': 'abc12345'
}
{
'product': 'Morphy Richards Food Mixer',
'total_value': 431,
'quantity': 1,
'product_id': 'pqr88223'
}
{
'product': 'Russell Hobbs Chrome Kettle',
'total_value': 16,
'quantity': 1,
'product_id': 'xyz11228'
}
{
'product': 'Karcher Hose Set',
'total_value': 66,
'quantity': 3,
'product_id': 'def45678'
}

結果ドキュメントには、コストが 15 ドルを超える製品の合計値と注文数に関する詳細が含まれます。

この チュートリアル の完全なコードを表示するには、次を参照してください: Github.

← グループと合計