Docs Menu

Docs Home애플리케이션 개발Python 드라이버PyMongo

일대일 조인(join)

이 페이지의 내용

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

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

이 애그리게이션은 일대일 조인을 수행합니다. 일대일 조인은 한 컬렉션의 문서에 동일한 필드 값을 가진 다른 컬렉션의 단일 문서와 일치하는 필드 값이 있을 때 발생합니다. 애그리게이션은 이러한 문서를 필드 값과 일치시키고 두 소스의 정보를 하나의 결과로 결합합니다.

일대일 조인에서는 문서가 일대일 관계를 가질 필요가 없습니다. 이 데이터 관계에 대해 자세히 알아보려면 일대일(데이터 모델)에 대한 Wikipedia 항목을 참조하세요.

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

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

  • orders: 상점의 제품에 대한 개별 주문을 설명하는 문서를 포함합니다.

  • products: 상점에서 판매하는 제품을 설명하는 문서를 포함합니다.

주문에는 하나의 제품만 포함될 수 있으므로 애그리게이션은 일대일 조인을 사용하여 주문 문서를 제품 문서와 일치시킵니다. 컬렉션은 두 컬렉션의 문서에 존재하는 product_id 필드로 결합됩니다.

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

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

orders_coll = agg_db["orders"]
products_coll = agg_db["products"]

다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 orders collection에 삽입합니다.

orders_coll.delete_many({})
order_data = [
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 5, 30, 8, 35, 52),
"product_id": "a1b2c3d4",
"value": 431.43
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2019, 5, 28, 19, 13, 32),
"product_id": "z9y8x7w6",
"value": 5.01
},
{
"customer_id": "oranieri@warmmail.com",
"orderdate": datetime(2020, 1, 1, 8, 25, 37),
"product_id": "ff11gg22hh33",
"value": 63.13
},
{
"customer_id": "jjones@tepidmail.com",
"orderdate": datetime(2020, 12, 26, 8, 55, 46),
"product_id": "a1b2c3d4",
"value": 429.65
}
]
orders_coll.insert_many(order_data)

다음 코드에 표시된 대로 기존 데이터를 삭제하고 샘플 데이터를 products collection에 삽입합니다.

products_coll.delete_many({})
product_data = [
{
"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"
}
]
products_coll.insert_many(product_data)
1

2020 에 접수된 주문과 일치하는 $match 단계를 추가합니다.

pipeline.append({
"$match": {
"orderdate": {
"$gte": datetime(2020, 1, 1, 0, 0, 0),
"$lt": datetime(2021, 1, 1, 0, 0, 0)
}
}
})
2

다음으로 $lookup 단계를 추가합니다. $lookup 단계는 orders 컬렉션의 product_id 필드를 products 컬렉션의 id 필드에 조인합니다.

pipeline.append({
"$lookup": {
"from": "products",
"localField": "product_id",
"foreignField": "id",
"as": "product_mapping"
}
})
3

다음으로, 파이프라인에 두 개의 $set 단계를 추가합니다.

첫 번째 $set 단계에서는 product_mapping 필드를 이전 $lookup 단계에서 만든 product_mapping 객체의 첫 번째 요소로 설정합니다.

두 번째 $set 단계에서는 product_mapping 객체 필드의 값에서 두 개의 새 필드 product_nameproduct_category 를 생성합니다.

pipeline.extend([
{
"$set": {
"product_mapping": {"$first": "$product_mapping"}
}
},
{
"$set": {
"product_name": "$product_mapping.name",
"product_category": "$product_mapping.category"
}
}
])

이는 일대일 조인이므로 $lookup 단계에서는 입력 문서에 배열 요소를 하나만 추가합니다. 파이프라인은 $first 연산자를 사용하여 이 요소에서 데이터를 검색합니다.

4

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

pipeline.append({"$unset": ["_id", "product_id", "product_mapping"]})
5

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

aggregation_result = orders_coll.aggregate(pipeline)

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

python3 agg_tutorial.py
6

애그리게이션된 결과에는 세 개의 문서가 포함됩니다. 문서는 주문한 제품의 product_nameproduct_category 를 사용하여 2020년에 발생한 고객 주문을 나타냅니다.

{
'customer_id': 'elise_smith@myemail.com',
'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52),
'value': 431.43,
'product_name': 'Asus Laptop',
'product_category': 'ELECTRONICS'
}
{
'customer_id': 'oranieri@warmmail.com',
'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37),
'value': 63.13,
'product_name': 'Morphy Richardds Food Mixer',
'product_category': 'KITCHENWARE'
}
{
'customer_id': 'jjones@tepidmail.com',
'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46),
'value': 429.65,
'product_name': 'Asus Laptop',
'product_category': 'ELECTRONICS'
}

결과는 orders 컬렉션과 products 컬렉션에 있는 문서의 필드를 포함하는 문서로 구성되며, 각 원본 문서에 있는 product_id 필드를 일치시켜 결합합니다.

To view the complete code for this tutorial, see the Completed One-to-one Join App on GitHub.

← 배열 압축 풀기 및 그룹화