Docs Menu
Docs Home
/ / /
Node.js 드라이버
/

다중 필드 조인

이 페이지의 내용

  • 서론
  • 집계 작업 요약
  • 시작하기 전에
  • 튜토리얼
  • collection을 연결하고 필드를 가져오는 조회 단계 추가
  • 2020년에 주문한 제품에 매치 단계 추가
  • 설정되지 않은 단계를 추가하여 불필요한 필드 제거
  • 집계 파이프라인을 실행합니다.
  • 결과 해석

이 튜토리얼에서는 샘플 앱을 완료하고 실행하여 Node.js 드라이버를 사용하여 집계 파이프라인을 구성하고, collection에서 집계를 수행하고, 결과를 인쇄하는 방법을 배울 수 있습니다.

이 애그리게이션은 다중 필드 조인을 수행합니다. 다중 필드 조인은 문서를 서로 일치시키는 데 사용하는 두 컬렉션의 문서에 해당 필드가 여러 개 있는 경우 발생합니다. 애그리게이션은 이러한 문서를 필드 값에서 일치시키고 두 문서의 정보를 하나의 문서로 결합합니다.

일대다 조인

일대다 조인은 다양한 다중 필드 조인입니다. 일대다 조인을 수행할 때는 조인의 반대편에 있는 여러 문서의 필드 값과 일치하는 문서 에서 하나의 필드 를 선택합니다. 이러한 데이터 관계에 학습 보려면 일대다(데이터 모델)다대다(데이터 모델 모델 )에 대한 Wikipedia 항목을 참조하세요.

이 튜토리얼에서는 제품 정보를 설명하는 collection의 데이터를 고객 주문을 설명하는 다른 collection과 결합하는 방법을 보여줍니다. 결과에는 각 주문에 대한 세부 정보가 포함된 2020년에 주문된 제품 목록이 표시됩니다.

이 예제에서는 두 개의 collection을 사용합니다:

  • products, 상점에서 판매하는 제품을 설명하는 문서가 포함되어 있습니다.

  • orders, 상점의 제품에 대한 개별 주문을 설명하는 문서가 포함되어 있습니다.

주문에는 하나의 제품만 포함할 수 있으므로 애그리게이션은 다중 필드 조인을 사용하여 제품 문서를 해당 제품의 주문을 나타내는 문서와 일치시킵니다. collection은 orders collection 문서의 product_nameproduct_variation 필드에 해당하는 products collection 문서의 namevariation 필드로 결합됩니다.

이 튜토리얼을 시작하기 전에 애그리게이션 템플릿 앱 지침을 완료하여 작동하는 Node.js 애플리케이션 을 설정하다 하세요.

앱을 설정한 후 애플리케이션에 다음 코드를 추가하여 productsorders 컬렉션에 액세스합니다.

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);
1

파이프라인의 첫 번째 단계는 각 컬렉션의 두 필드를 기준으로 orders 컬렉션을 products 컬렉션에 조인하는 $lookup 단계입니다. 조회 단계에는 조인을 구성하기 위한 파이프라인이 포함되어 있습니다.

포함된 파이프라인 내에서 조인 양쪽에 있는 두 필드의 값을 일치시키는 $match 단계를 추가합니다. 다음 코드는 $lookup 단계를 만들때 설정한 namevariation 필드에 별칭을 사용합니다.

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",
},
});
2

다음으로, 이전 단계에서 계산한 orders 배열을 기반으로 $match 단계를 추가하여 2020 에 주문이 하나 이상 있는 제품만 표시합니다.

pipeline.push({
$match: {
orders: { $ne: [] },
},
});
3

마지막으로 $unset 단계를 추가합니다. $unset 단계는 결과 문서에서 _iddescription 필드를 제거합니다.

pipeline.push({
$unset: ["_id", "description"],
});
4

products collection에서 애그리게이션을 수행하려면 애플리케이션 끝에 다음 코드를 추가하세요.

const aggregationResult = await productsColl.aggregate(pipeline);

마지막으로 shell에서 다음 명령을 실행하여 애플리케이션을 시작합니다.

node agg_tutorial.js
5

애그리게이션된 결과에는 두 개의 문서가 포함됩니다. 이 문서는 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 참조하세요. 에서 .

돌아가기

일대일 조인(join)