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)