Docs Menu

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

다중 필드 조인

이 페이지의 내용

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

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

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

일대다 조인

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

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

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

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

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

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

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

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

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

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

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

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

orders_coll.delete_many({})
order_data = [
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 5, 30, 8, 35, 52),
"product_name": "Asus Laptop",
"product_variation": "Standard Display",
"value": 431.43
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2019, 5, 28, 19, 13, 32),
"product_name": "The Day Of The Triffids",
"product_variation": "2nd Edition",
"value": 5.01
},
{
"customer_id": "oranieri@warmmail.com",
"orderdate": datetime(2020, 1, 1, 8, 25, 37),
"product_name": "Morphy Richards Food Mixer",
"product_variation": "Deluxe",
"value": 63.13
},
{
"customer_id": "jjones@tepidmail.com",
"orderdate": datetime(2020, 12, 26, 8, 55, 46),
"product_name": "Asus Laptop",
"product_variation": "Standard Display",
"value": 429.65
}
]
orders_coll.insert_many(order_data)
1

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

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

embedded_pl = [
{
"$match": {
"$expr": {
"$and": [
{"$eq": ["$product_name", "$$prdname"]},
{"$eq": ["$product_variation", "$$prdvartn"]}
]
}
}
}
]

포함된 파이프라인 내에서 2020에 접수된 주문과 일치하도록 또 다른 $match 단계를 추가합니다.

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

포함된 파이프라인 내에서 $unset 단계를 추가하여 조인의 orders 컬렉션 사이드에서 불필요한 필드를 제거합니다.

embedded_pl.append({
"$unset": ["_id", "product_name", "product_variation"]
})

임베디드 파이프라인이 완료되면 $lookup 단계를 기본 집계 파이프라인에 추가합니다. 처리된 조회 필드를 orders 배열 필드에 저장하도록 이 단계를 구성합니다.

pipeline.append({
"$lookup": {
"from": "orders",
"let": {
"prdname": "$name",
"prdvartn": "$variation"
},
"pipeline": embedded_pl,
"as": "orders"
}
})
2

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

pipeline.append({
"$match": {
"orders": {"$ne": []}
}
})
3

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

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

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

aggregation_result = products_coll.aggregate(pipeline)

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

python3 agg_tutorial.py
5

애그리게이션된 결과에는 두 개의 문서가 포함됩니다. 이 문서는 2020년에 주문이 접수된 제품을 나타냅니다. 각 문서에는 해당 제품의 각 주문에 대한 세부 정보를 나열하는 orders 배열 필드가 포함되어 있습니다.

{
'name': 'Asus Laptop',
'variation': 'Standard Display',
'category': 'ELECTRONICS',
'orders': [
{
'customer_id': 'elise_smith@myemail.com',
'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52),
'value': 431.43
},
{
'customer_id': 'jjones@tepidmail.com',
'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46),
'value': 429.65
}
]
}
{
'name': 'Morphy Richards Food Mixer',
'variation': 'Deluxe',
'category': 'KITCHENWARE',
'orders': [
{
'customer_id': 'oranieri@warmmail.com',
'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37),
'value': 63.13
}
]
}

결과 문서에는 orders collection 및 products collection에 있는 문서의 세부 정보가 제품 이름 및 변형으로 결합되어 포함됩니다.

이 튜토리얼의 전체 코드를 보려면 완성된 다중 필드 조인 앱을 GitHub에서 참조하세요.

← 일대일 조인(join)