일대일 조인(join)
이 페이지의 내용
서론
이 튜토리얼에서는 샘플 앱을 완료하고 실행하여 Node.js 드라이버를 사용하여 집계 파이프라인을 구성하고, collection에서 집계를 수행하고, 결과를 인쇄하는 방법을 배울 수 있습니다.
이 애그리게이션은 일대일 조인을 수행합니다. 일대일 조인은 한 컬렉션의 문서에 동일한 필드 값을 가진 다른 컬렉션의 단일 문서와 일치하는 필드 값이 있을 때 발생합니다. 애그리게이션은 이러한 문서를 필드 값과 일치시키고 두 소스의 정보를 하나의 결과로 결합합니다.
팁
일대일 조인에서는 문서가 일대일 관계를 가질 필요가 없습니다. 이 데이터 관계에 대해 자세히 알아보려면 일대일(데이터 모델)에 대한 Wikipedia 항목을 참조하세요.
집계 작업 요약
이 튜토리얼에서는 제품 정보를 설명하는 collection의 데이터를 고객 주문을 설명하는 다른 collection과 결합하는 방법을 보여줍니다. 결과에는 각 주문과 관련된 제품 세부 정보를 포함하는 2020년에 이루어진 모든 주문 목록이 표시됩니다.
이 예제에서는 두 개의 collection을 사용합니다:
orders
: 상점의 제품에 대한 개별 주문을 설명하는 문서를 포함합니다.products
: 상점에서 판매하는 제품을 설명하는 문서를 포함합니다.
주문에는 하나의 제품만 포함될 수 있으므로 애그리게이션은 일대일 조인을 사용하여 주문 문서를 제품 문서와 일치시킵니다. 컬렉션은 두 컬렉션의 문서에 존재하는 product_id
필드로 결합됩니다.
시작하기 전에
이 튜토리얼을 시작하기 전에 애그리게이션 템플릿 앱 지침을 완료하여 작동하는 Node.js 애플리케이션 을 설정하다 하세요.
앱을 설정한 후 애플리케이션에 다음 코드를 추가하여 orders
및 products
컬렉션에 액세스합니다.
const ordersColl = aggDB.collection("orders"); const productsColl = aggDB.collection("products");
다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 orders
collection에 삽입합니다.
await ordersColl.deleteMany({}); const orderData = [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), product_id: "a1b2c3d4", value: 431.43, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), product_id: "z9y8x7w6", value: 5.01, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), product_id: "ff11gg22hh33", value: 63.13, }, { customer_id: "jjones@tepidmail.com", orderdate: new Date("2020-12-26T08:55:46Z"), product_id: "a1b2c3d4", value: 429.65, }, ]; await ordersColl.insertMany(orderData);
다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 products
collection에 삽입합니다.
await productsColl.deleteMany({}); const productData = [ { id: "a1b2c3d4", name: "Asus Laptop", category: "ELECTRONICS", description: "Good value laptop for students", }, { id: "z9y8x7w6", name: "The Day Of The Triffids", category: "BOOKS", description: "Classic post-apocalyptic novel", }, { id: "ff11gg22hh33", name: "Morphy Richardds Food Mixer", category: "KITCHENWARE", description: "Luxury mixer turning good cakes into great", }, { id: "pqr678st", name: "Karcher Hose Set", category: "GARDEN", description: "Hose + nosels + winder for tidy storage", }, ]; await productsColl.insertMany(productData);
튜토리얼
2020년 주문에 매치 단계 추가
2020 에 접수된 주문과 일치하는 $match 단계를 추가합니다.
pipeline.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
collection을 연결하는 조회 단계 추가
다음으로 $lookup 단계를 추가합니다. $lookup
단계는 orders
컬렉션의 product_id
필드를 products
컬렉션의 id
필드에 조인합니다.
pipeline.push({ $lookup: { from: "products", localField: "product_id", foreignField: "id", as: "product_mapping", }, });
새 문서 필드를 만들기 위한 세트 단계 추가
다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.
첫 번째 $set
단계에서는 product_mapping
필드를 이전 $lookup
단계에서 만든 product_mapping
객체의 첫 번째 요소로 설정합니다.
두 번째 $set
단계에서는 product_mapping
객체 필드의 값에서 두 개의 새 필드 product_name
및 product_category
를 생성합니다.
pipeline.push( { $set: { product_mapping: { $first: "$product_mapping" }, }, }, { $set: { product_name: "$product_mapping.name", product_category: "$product_mapping.category", }, } );
팁
이는 일대일 조인이므로 $lookup
단계에서는 입력 문서에 배열 요소를 하나만 추가합니다. 파이프라인은 $first 연산자를 사용하여 이 요소에서 데이터를 검색합니다.
설정되지 않은 단계를 추가하여 불필요한 필드 제거
마지막으로 $unset 단계를 추가합니다. $unset
단계에서는 문서에서 불필요한 필드를 제거합니다.
pipeline.push({ $unset: ["_id", "product_id", "product_mapping"] });
결과 해석
애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_name
및 product_category
를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.
{ customer_id: 'elise_smith@myemail.com', orderdate: 2020-05-30T08:35:52.000Z, value: 431.43, product_name: 'Asus Laptop', product_category: 'ELECTRONICS' } { customer_id: 'oranieri@warmmail.com', orderdate: 2020-01-01T08:25:37.000Z, value: 63.13, product_name: 'Morphy Richardds Food Mixer', product_category: 'KITCHENWARE' } { customer_id: 'jjones@tepidmail.com', orderdate: 2020-12-26T08:55:46.000Z, value: 429.65, product_name: 'Asus Laptop', product_category: 'ELECTRONICS' }
결과는 orders
컬렉션과 products
컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id
필드를 일치시켜 결합합니다.
이 튜토리얼의 전체 코드를 보려면 완료된 일대일 조인 앱을 Github참조하세요. 에서 .