Docs Menu
Docs Home
/ / /
Node.js
/

グループと合計

項目一覧

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

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

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

pipeline.push({
$match: {
orderdate: {
$gte: new Date("2020-01-01T00:00:00Z"),
$lt: new Date("2021-01-01T00:00:00Z"),
},
},
});
2

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

pipeline.push({
$sort: {
orderdate: 1,
},
});
3

$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"
}
},
},
});
4

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

pipeline.push({
$sort: {
first_purchase_date: 1,
},
});
5

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

pipeline.push({
$set: {
customer_id: "$_id",
},
});
6

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

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

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

const aggregationResult = await ordersColl.aggregate(pipeline);

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

node agg_tutorial.js
8

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

戻る

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