그룹 및 합계
이 페이지의 내용
서론
이 튜토리얼에서는 Node.js 드라이버를 사용하여 집계 파이프라인을 구성하고 컬렉션에서 집계를 수행하며 샘플 앱을 완성하고 실행하여 결과를 인쇄하는 방법을 알아볼 수 있습니다. 이 집계는 다음 작업을 수행합니다.
문서의 하위 집합을 필드 값으로 일치
공통 필드 값을 기준으로 문서 그룹화
각 결과 문서에 계산된 필드를 추가합니다.
집계 작업 요약
이 튜토리얼에서는 고객 주문 데이터를 그룹화하고 분석하는 방법을 보여줍니다. 결과에는 2020년에 품목을 구매한 고객 목록이 표시되며 각 고객의 2020년 주문 내역이 포함됩니다.
이 예에서는 개별 제품 주문을 설명하는 문서가 포함된 orders
collection 하나를 사용합니다. 각 주문은 한 명의 고객에게만 해당할 수 있으므로 주문 문서는 고객 이메일 주소가 포함된 customer_id
필드를 기준으로 그룹화됩니다.
시작하기 전에
이 튜토리얼을 시작하기 전에 애그리게이션 템플릿 앱 지침을 완료하여 작동하는 Node.js 애플리케이션 을 설정하다 하세요.
앱을 설정한 후 애플리케이션에 다음 코드를 추가하여 orders
컬렉션에 액세스합니다.
const ordersColl = aggDB.collection("orders");
다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 orders
collection에 삽입합니다.
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);
튜토리얼
2020년 주문에 매치 단계 추가
먼저 2020 에 접수된 주문과 일치하는 $match 단계를 추가합니다.
pipeline.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
주문 날짜별로 정렬하는 sort 단계를 추가합니다
다음으로, $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 에서 완료된 그룹 및 총 앱 을(를)Github 참조하세요.