配列とグループを解凍
項目一覧
はじめに
このチュートリアルでは、Node.js ドライバーを使用して集計パイプラインを構築し、コレクションに対して集計を実行し、サンプル アプリを完了して実行して結果を出力する方法を学習できます。 この集計では、次の操作が実行されます。
配列フィールドを個別のドキュメントに展開
フィールド値でドキュメントのサブセットと一致
ドキュメントを共通のフィールド値でグループ化
各結果ドキュメントに計算フィールドを追加します
集計タスクの概要
このチュートリアルでは、カスタマーの注文データからインサイトを作成する方法を説明します。 結果は、コストが $15 を超える注文された製品のリストを示し、各ドキュメントには各製品の販売ユニット数と合計売上額が含まれています。
この例では、製品の注文を説明するドキュメントを含む 1 つのコレクション orders
を使用します。 各注文には複数の製品が含まれているため、集計の最初のステップはproducts
配列を個々の製品注文ドキュメントに解凍します。
始める前に
このチュートリアルを開始する前に、 集計テンプレートアプリの手順を完了して、動作する Node.js アプリケーションを設定してください。
アプリを設定したら、次のコードをアプリケーションに追加してorders
コレクションにアクセスします。
const ordersColl = aggDB.collection("orders");
次のコードに示すように、既存の データを削除し、サンプル データをorders
コレクションに挿入します。
await ordersColl.deleteMany({}); const orderData = [ { 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, }, ], }, ]; await ordersColl.insertMany(orderData);
Tutorial
製品注文の配列を解凍するために展開ステージを追加します
まず、 $unwindステージを追加して、 products
配列のエントリを個々のドキュメントに分割します。
pipeline.push({ $unwind: { path: "$products", }, });
15 ドルを超えるコストの製品に一致するステージを追加する
次に、 products.price
の値が15
より大きい製品に一致する$matchステージを追加します。
pipeline.push({ $match: { "products.price": { $gt: 15, }, }, });
製品タイプ別にグループ化するためのグループ ステージを追加します
$groupステージを追加して、 prod_id
フィールドの値で注文をグループ化します。 このステージでは、結果ドキュメントに次のフィールドを作成する集計操作を追加します。
product
: 製品名total_value
: 製品の全売上の合計値quantity
: 製品の注文数
pipeline.push({ $group: { _id: "$products.prod_id", product: { $first: "$products.name" }, total_value: { $sum: "$products.price" }, quantity: { $sum: 1 }, }, });
製品 ID を表示するためにセット ステージを追加します
$setステージを追加して、 $group
ステージ中に設定された_id
フィールドの値からproduct_id
フィールドを再作成します。
pipeline.push({ $set: { product_id: "$_id", }, });
不要なフィールドを削除するために設定されていない ステージを追加します
最後に、 $unsetステージを追加します。 $unset
ステージでは、結果ドキュメントから_id
フィールドが削除されます。
pipeline.push({ $unset: ["_id"] });
結果の解釈
この集計により、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の 完了した解凍配列アプリ Githubを参照してください。