グループと合計
項目一覧
はじめに
このチュートリアルでは、Node.js ドライバーを使用して集計パイプラインを構築し、コレクションに対して集計を実行し、サンプル アプリを完了して実行して結果を出力する方法を学習できます。 この集計では、次の操作が実行されます。
フィールド値でドキュメントのサブセットと一致
ドキュメントを共通のフィールド値でグループ化
各結果ドキュメントに計算フィールドを追加します
集計タスクの概要
このチュートリアルでは、カスタマーの注文データをグループ化して分析する方法を説明します。 結果には、2020 年に商品を購入したカスタマーのリストが表示され、2020 年における各カスタマーの注文履歴が含まれています。
この例では、個々の製品の注文を説明するドキュメントを含む 1 つのコレクション orders
を使用します。 各注文は 1 人のカスタマーのみに対応できるため、注文ドキュメントはカスタマーのメールアドレスを含むcustomer_id
フィールドでグループ化されます。
始める前に
このチュートリアルを開始する前に、 集計テンプレートアプリの手順を完了して、動作する Node.js アプリケーションを設定してください。
アプリを設定したら、次のコードをアプリケーションに追加してorders
コレクションにアクセスします。
const ordersColl = aggDB.collection("orders");
次のコードに示すように、既存の データを削除し、サンプル データをorders
コレクションに挿入します。
await ordersColl.deleteMany({}); const orderData = [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), value: 231, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-01-13T09:32:07Z"), value: 99, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), value: 63, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), value: 2, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2020-11-23T22:56:53Z"), value: 187, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2020-08-18T23:04:48Z"), value: 4, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-12-26T08:55:46Z"), value: 4, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2021-02-29T07:49:32Z"), value: 1024, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-10-03T13:49:44Z"), value: 102, }, ]; await ordersColl.insertMany(orderData);
Tutorial
2020 年注文の一致ステージを追加します
まず、 2020での注文に一致する$matchステージを追加します。
pipeline.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
注文日で並べ替えるソートステージを追加
次に、 $sortステージを追加して、 orderdate
フィールドで昇順の並べ替えを設定し、次のステージで各カスタマーの最も近い2020の購入を表示します。
pipeline.push({ $sort: { orderdate: 1, }, });
メールアドレスでグループ化するためのグループステージの追加
$groupステージを追加して、 customer_id
フィールドの値で注文をグループ化します。 このステージでは、結果ドキュメントに次のフィールドを作成する集計操作を追加します。
first_purchase_date
: カスタマーの最初の購入日total_value
: すべてのカスタマーの売上合計値total_orders
: カスタマーの購入合計数orders
: 各購入の日付と金額を含む、すべてのカスタマーの購入のリスト
pipeline.push({ $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.push({ $sort: { first_purchase_date: 1, }, });
メールアドレスを表示するために設定ステージを追加します
$setステージを追加して、 $group
ステージ中に設定された_id
フィールドの値からcustomer_id
フィールドを再作成します。
pipeline.push({ $set: { customer_id: "$_id", }, });
不要なフィールドを削除するために設定されていない ステージを追加します
最後に、 $unsetステージを追加します。 $unset
ステージでは、結果ドキュメントから_id
フィールドが削除されます。
pipeline.push({ $unset: ["_id"] });
結果の解釈
この集計により、2020 年からのカスタマーの注文に関する次の概要が返されます。
{ first_purchase_date: 2020-01-01T08:25:37.000Z, total_value: 63, total_orders: 1, orders: [ { orderdate: 2020-01-01T08:25:37.000Z, value: 63 } ], customer_id: 'oranieri@warmmail.com' } { first_purchase_date: 2020-01-13T09:32:07.000Z, total_value: 436, total_orders: 4, orders: [ { orderdate: 2020-01-13T09:32:07.000Z, value: 99 }, { orderdate: 2020-05-30T08:35:52.000Z, value: 231 }, { orderdate: 2020-10-03T13:49:44.000Z, value: 102 }, { orderdate: 2020-12-26T08:55:46.000Z, value: 4 } ], customer_id: 'elise_smith@myemail.com' } { first_purchase_date: 2020-08-18T23:04:48.000Z, total_value: 191, total_orders: 2, orders: [ { orderdate: 2020-08-18T23:04:48.000Z, value: 4 }, { orderdate: 2020-11-23T22:56:53.000Z, value: 187 } ], customer_id: 'tj@wheresmyemail.com' }
結果ドキュメントには、特定のカスタマーからのすべての注文の詳細が、カスタマーのメールアドレス別にグループ化されて含まれます。
このチュートリアルの完全なコードを表示するには、「 完了した グループと合計アプリ Github」を参照してください。 .