배열 압축 풀기 및 그룹화
이 페이지의 내용
서론
이 튜토리얼에서는 Node.js 드라이버를 사용하여 집계 파이프라인을 구성하고 컬렉션에서 집계를 수행하며 샘플 앱을 완성하고 실행하여 결과를 인쇄하는 방법을 알아볼 수 있습니다. 이 집계는 다음 작업을 수행합니다.
배열 필드를 별도의 문서로 풀기
문서의 하위 집합을 필드 값으로 일치
공통 필드 값을 기준으로 문서 그룹화
각 결과 문서에 계산된 필드를 추가합니다.
집계 작업 요약
이 튜토리얼에서는 고객 주문 데이터에서 인사이트를 만드는 방법을 보여줍니다. 결과에는 비용이 $15 이상인 주문된 제품 목록이 표시되며 각 문서에는 판매된 단위 수와 각 제품의 총 판매 금액이 포함됩니다.
이 예제에서는 제품 주문을 설명하는 문서가 포함된 orders
collection 하나를 사용합니다. 각 주문에는 여러 제품이 포함되므로 애그리게이션의 첫 번째 단계는 products
배열을 개별 제품 주문 문서로 압축을 푸는 것입니다.
시작하기 전에
이 튜토리얼을 시작하기 전에 애그리게이션 템플릿 앱 지침을 완료하여 작동하는 Node.js 애플리케이션 을 설정하다 하세요.
앱을 설정한 후 애플리케이션에 다음 코드를 추가하여 orders
컬렉션에 액세스합니다.
const ordersColl = aggDB.collection("orders");
다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 orders
collection에 삽입합니다.
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);
튜토리얼
해제 단계를 추가하여 제품 주문 배열의 압축을 풉니다
먼저 $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 참조하세요. 에서 .