Docs Menu

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

배열 압축 풀기 및 그룹화

이 페이지의 내용

  • 서론
  • 집계 작업 요약
  • 시작하기 전에
  • 튜토리얼
  • 해제 단계를 추가하여 제품 주문 배열의 압축을 풉니다
  • 가격이 $15 이상인 제품에 대해 매치 단계 추가
  • 제품 유형별로 그룹화하려면 그룹 단계를 추가하세요.
  • 제품 ID를 표시하는 단계 추가
  • 설정되지 않은 단계를 추가하여 불필요한 필드 제거
  • 집계 파이프라인을 실행합니다.
  • 결과 해석

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

  • 배열 필드를 별도의 문서로 풀기

  • 문서의 하위 집합을 필드 값으로 일치

  • 공통 필드 값을 기준으로 문서 그룹화

  • 각 결과 문서에 계산된 필드를 추가합니다.

이 튜토리얼에서는 고객 주문 데이터에서 인사이트를 만드는 방법을 보여줍니다. 결과에는 비용이 $15 이상인 주문된 제품 목록이 표시되며 각 문서에는 판매된 단위 수와 각 제품의 총 판매 금액이 포함됩니다.

이 예제에서는 제품 주문을 설명하는 문서가 포함된 orders collection 하나를 사용합니다. 각 주문에는 여러 제품이 포함되므로 애그리게이션의 첫 번째 단계는 products 배열을 개별 제품 주문 문서로 압축을 푸는 것입니다.

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

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

orders_coll = agg_db["orders"]

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

orders_coll.delete_many({})
order_data = [
{
"order_id": 6363763262239,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 22,
},
]
},
{
"order_id": 1197372932325,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 429,
}
]
},
{
"order_id": 9812343774839,
"products": [
{
"prod_id": "pqr88223",
"name": "Morphy Richards Food Mixer",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 21,
}
]
},
{
"order_id": 4433997244387,
"products": [
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 23,
},
{
"prod_id": "jkl77336",
"name": "Picky Pencil Sharpener",
"price": 1,
},
{
"prod_id": "xyz11228",
"name": "Russell Hobbs Chrome Kettle",
"price": 16,
}
]
}
]
orders_coll.insert_many(order_data)
1

먼저, $unwind 단계를 추가하여 products 배열의 항목을 개별 문서로 분리합니다.

pipeline.append({
"$unwind": {
"path": "$products"
}
})
2

다음으로, products.price 값이 15 보다 큰 제품과 일치하는 $match 단계를 추가합니다.

pipeline.append({
"$match": {
"products.price": {
"$gt": 15
}
}
})
3

$group 단계를 추가하여 prod_id 필드 값을 기준으로 주문을 그룹화합니다. 이 단계에서는 결과 문서에 다음 필드를 생성하는 애그리게이션 작업을 추가합니다.

  • product: 제품 이름

  • total_value: 제품의 모든 판매의 총 가치

  • quantity: 제품의 주문 수

pipeline.append({
"$group": {
"_id": "$products.prod_id",
"product": {"$first": "$products.name"},
"total_value": {"$sum": "$products.price"},
"quantity": {"$sum": 1}
}
})
4

$set 단계를 추가하여 $group 단계에서 설정한 _id 필드의 값에서 product_id 필드를 다시 만듭니다.

pipeline.append({
"$set": {
"product_id": "$_id"
}
})
5

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

pipeline.append({"$unset": ["_id"]})
6

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

aggregation_result = orders_coll.aggregate(pipeline)

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

python3 agg_tutorial.py
7

이 애그리게이션은 2020년의 고객 주문에 대한 다음과 같은 요약을 반환합니다.

{
'product': 'Asus Laptop',
'total_value': 860,
'quantity': 2,
'product_id': 'abc12345'
}
{
'product': 'Morphy Richards Food Mixer',
'total_value': 431,
'quantity': 1,
'product_id': 'pqr88223'
}
{
'product': 'Russell Hobbs Chrome Kettle',
'total_value': 16,
'quantity': 1,
'product_id': 'xyz11228'
}
{
'product': 'Karcher Hose Set',
'total_value': 66,
'quantity': 3,
'product_id': 'def45678'
}

결과 문서에는 비용이 $15 이상인 제품의 총 주문 금액과 수량에 대한 세부 정보가 포함되어 있습니다.

이 튜토리얼의 전체 코드를 보려면 완료된 배열 언팩 앱 을 Github 참조하세요. 에서 .

← 그룹 및 합계