다중 필드 조인
이 페이지의 내용
서론
이 튜토리얼에서는 샘플 앱을 완료하고 실행하여 Node.js 드라이버를 사용하여 집계 파이프라인을 구성하고, collection에서 집계를 수행하고, 결과를 인쇄하는 방법을 배울 수 있습니다.
이 애그리게이션은 다중 필드 조인을 수행합니다. 다중 필드 조인은 문서를 서로 일치시키는 데 사용하는 두 컬렉션의 문서에 해당 필드가 여러 개 있는 경우 발생합니다. 애그리게이션은 이러한 문서를 필드 값에서 일치시키고 두 문서의 정보를 하나의 문서로 결합합니다.
팁
일대다 조인
일대다 조인은 다양한 다중 필드 조인입니다. 일대다 조인을 수행할 때는 조인의 반대편에 있는 여러 문서의 필드 값과 일치하는 문서 에서 하나의 필드 를 선택합니다. 이러한 데이터 관계에 학습 보려면 일대다(데이터 모델) 및 다대다(데이터 모델 모델 )에 대한 Wikipedia 항목을 참조하세요.
집계 작업 요약
이 튜토리얼에서는 제품 정보를 설명하는 collection의 데이터를 고객 주문을 설명하는 다른 collection과 결합하는 방법을 보여줍니다. 결과에는 각 주문에 대한 세부 정보가 포함된 2020년에 주문된 제품 목록이 표시됩니다.
이 예제에서는 두 개의 collection을 사용합니다:
products
, 상점에서 판매하는 제품을 설명하는 문서가 포함되어 있습니다.orders
, 상점의 제품에 대한 개별 주문을 설명하는 문서가 포함되어 있습니다.
주문에는 하나의 제품만 포함할 수 있으므로 애그리게이션은 다중 필드 조인을 사용하여 제품 문서를 해당 제품의 주문을 나타내는 문서와 일치시킵니다. collection은 orders
collection 문서의 product_name
및 product_variation
필드에 해당하는 products
collection 문서의 name
및 variation
필드로 결합됩니다.
시작하기 전에
이 튜토리얼을 시작하기 전에 애그리게이션 템플릿 앱 지침을 완료하여 작동하는 Node.js 애플리케이션 을 설정하다 하세요.
앱을 설정한 후 애플리케이션에 다음 코드를 추가하여 products
및 orders
컬렉션에 액세스합니다.
const productsColl = aggDB.collection("products"); const ordersColl = aggDB.collection("orders");
다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 products
collection에 삽입합니다.
await productsColl.deleteMany({}); const productsData = [ { name: "Asus Laptop", variation: "Ultra HD", category: "ELECTRONICS", description: "Great for watching movies", }, { name: "Asus Laptop", variation: "Standard Display", category: "ELECTRONICS", description: "Good value laptop for students", }, { name: "The Day Of The Triffids", variation: "1st Edition", category: "BOOKS", description: "Classic post-apocalyptic novel", }, { name: "The Day Of The Triffids", variation: "2nd Edition", category: "BOOKS", description: "Classic post-apocalyptic novel", }, { name: "Morphy Richards Food Mixer", variation: "Deluxe", category: "KITCHENWARE", description: "Luxury mixer turning good cakes into great", }, ]; await productsColl.insertMany(productsData);
다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 orders
collection에 삽입합니다.
await ordersColl.deleteMany({}); const orderData = [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 431.43, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), product_name: "The Day Of The Triffids", product_variation: "2nd Edition", value: 5.01, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), product_name: "Morphy Richards Food Mixer", product_variation: "Deluxe", value: 63.13, }, { customer_id: "jjones@tepidmail.com", orderdate: new Date("2020-12-26T08:55:46Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 429.65, }, ]; await ordersColl.insertMany(orderData);
튜토리얼
collection을 연결하고 필드를 가져오는 조회 단계 추가
파이프라인의 첫 번째 단계는 각 컬렉션의 두 필드를 기준으로 orders
컬렉션을 products
컬렉션에 조인하는 $lookup 단계입니다. 조회 단계에는 조인을 구성하기 위한 파이프라인이 포함되어 있습니다.
포함된 파이프라인 내에서 조인 양쪽에 있는 두 필드의 값을 일치시키는 $match 단계를 추가합니다. 다음 코드는 $lookup 단계를 만들때 설정한 name
및 variation
필드에 별칭을 사용합니다.
const embedded_pl = []; embedded_pl.push({ $match: { $expr: { $and: [ { $eq: ["$product_name", "$$prdname"] }, { $eq: ["$product_variation", "$$prdvartn"] }, ], }, }, });
포함된 파이프라인 내에서 2020 에 접수된 주문과 일치하도록 다른 $match 단계를 추가합니다.
embedded_pl.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
포함된 파이프라인 내에서 $unset 단계를 추가하여 조인의 orders
컬렉션 사이드에서 불필요한 필드를 제거합니다.
embedded_pl.push({ $unset: ["_id", "product_name", "product_variation"], });
임베디드 파이프라인이 완료되면 $lookup
단계를 기본 집계 파이프라인에 추가합니다. 처리된 조회 필드를 orders
배열 필드에 저장하도록 이 단계를 구성합니다.
pipeline.push({ $lookup: { from: "orders", let: { prdname: "$name", prdvartn: "$variation", }, pipeline: embedded_pl, as: "orders", }, });
2020년에 주문한 제품에 매치 단계 추가
다음으로, 이전 단계에서 계산한 orders
배열을 기반으로 $match 단계를 추가하여 2020 에 주문이 하나 이상 있는 제품만 표시합니다.
pipeline.push({ $match: { orders: { $ne: [] }, }, });
설정되지 않은 단계를 추가하여 불필요한 필드 제거
마지막으로 $unset 단계를 추가합니다. $unset
단계는 결과 문서에서 _id
및 description
필드를 제거합니다.
pipeline.push({ $unset: ["_id", "description"], });
결과 해석
애그리게이션된 결과에는 두 개의 문서가 포함됩니다. 이 문서는 2020년에 주문이 접수된 제품을 나타냅니다. 각 문서에는 해당 제품의 각 주문에 대한 세부 정보를 나열하는 orders
배열 필드가 포함되어 있습니다.
{ name: 'Asus Laptop', variation: 'Standard Display', category: 'ELECTRONICS', orders: [ { customer_id: 'elise_smith@myemail.com', orderdate: 2020-05-30T08:35:52.000Z, value: 431.43 }, { customer_id: 'jjones@tepidmail.com', orderdate: 2020-12-26T08:55:46.000Z, value: 429.65 } ] } { name: 'Morphy Richards Food Mixer', variation: 'Deluxe', category: 'KITCHENWARE', orders: [ { customer_id: 'oranieri@warmmail.com', orderdate: 2020-01-01T08:25:37.000Z, value: 63.13 } ] }
결과 문서에는 orders
collection 및 products
collection에 있는 문서의 세부 정보가 제품 이름 및 변형으로 결합되어 포함됩니다.
이 튜토리얼의 전체 코드를 보려면 완성된 다중 필드 조인 앱 을 Github 참조하세요. 에서 .