Docs Menu
Docs Home
/ / /
PyMongo
/ /

그룹 및 합계

이 페이지의 내용

  • 서론
  • 집계 작업 요약
  • 시작하기 전에
  • 튜토리얼
  • 2020년 주문에 매치 단계 추가
  • 주문 날짜별로 정렬하는 sort 단계를 추가합니다
  • 이메일 주소별로 그룹화할 그룹 단계 추가
  • 첫 주문 날짜별로 정렬하는 정렬 단계 추가
  • 이메일 주소를 표시하는 단계 추가
  • 설정되지 않은 단계를 추가하여 불필요한 필드 제거
  • 집계 파이프라인을 실행합니다.
  • 결과 해석

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

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

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

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

이 튜토리얼에서는 고객 주문 데이터를 그룹화하고 분석하는 방법을 보여줍니다. 결과에는 2020년에 품목을 구매한 고객 목록이 표시되며 각 고객의 2020년 주문 내역이 포함됩니다.

이 예에서는 개별 제품 주문을 설명하는 문서가 포함된 orders collection 하나를 사용합니다. 각 주문은 한 명의 고객에게만 해당할 수 있으므로 주문 문서는 고객 이메일 주소가 포함된 customer_id 필드를 기준으로 그룹화됩니다.

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

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

orders_coll = agg_db["orders"]

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

orders_coll.delete_many({})
order_data = [
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 5, 30, 8, 35, 52),
"value": 231
},
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 1, 13, 9, 32, 7),
"value": 99
},
{
"customer_id": "oranieri@warmmail.com",
"orderdate": datetime(2020, 1, 1, 8, 25, 37),
"value": 63
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2019, 5, 28, 19, 13, 32),
"value": 2
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2020, 11, 23, 22, 56, 53),
"value": 187
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2020, 8, 18, 23, 4, 48),
"value": 4
},
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 12, 26, 8, 55, 46),
"value": 4
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2021, 2, 28, 7, 49, 32),
"value": 1024
},
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 10, 3, 13, 49, 44),
"value": 102
}
]
orders_coll.insert_many(order_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

다음으로, $sort 단계를 추가하여 orderdate 필드에 오름차순 정렬을 설정하여 각 고객의 가장 이른 2020 구매를 다음 단계에서 표시합니다.

pipeline.append({
"$sort": {
"orderdate": 1
}
})
3

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

  • first_purchase_date: 고객의 첫 구매 날짜

  • total_value: 고객의 모든 구매 총액

  • total_orders: 고객의 총 구매 횟수

  • orders: 각 구매의 날짜 및 금액을 포함한 고객의 모든 구매 목록

pipeline.append({
"$group": {
"_id": "$customer_id",
"first_purchase_date": {"$first": "$orderdate"},
"total_value": {"$sum": "$value"},
"total_orders": {"$sum": 1},
"orders": {"$push": {"orderdate": "$orderdate", "value": "$value"}}
}
})
4

다음으로, 다른 $sort 단계를 추가하여 first_purchase_date 필드에 오름차순 정렬을 설정합니다.

pipeline.append({
"$sort": {
"first_purchase_date": 1
}
})
5

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

pipeline.append({
"$set": {
"customer_id": "$_id"
}
})
6

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

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

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

aggregation_result = orders_coll.aggregate(pipeline)

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

python3 agg_tutorial.py
8

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

{
'first_purchase_date': datetime.datetime(2020, 1, 1, 8, 25, 37),
'total_value': 63,
'total_orders': 1,
'orders': [ { 'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63 } ],
'customer_id': 'oranieri@warmmail.com'
}
{
'first_purchase_date': datetime.datetime(2020, 1, 13, 9, 32, 7),
'total_value': 436,
'total_orders': 4,
'orders': [
{ 'orderdate': datetime.datetime(2020, 1, 13, 9, 32, 7), 'value': 99 },
{ 'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 231 },
{ 'orderdate': datetime.datetime(2020, 10, 3, 13, 49, 44), 'value': 102 },
{ 'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 4 }
],
'customer_id': 'elise_smith@myemail.com'
}
{
'first_purchase_date': datetime.datetime(2020, 8, 18, 23, 4, 48),
'total_value': 191,
'total_orders': 2,
'orders': [
{ 'orderdate': datetime.datetime(2020, 8, 18, 23, 4, 48), 'value': 4 },
{ 'orderdate': datetime.datetime(2020, 11, 23, 22, 56, 53), 'value': 187 }
],
'customer_id': 'tj@wheresmyemail.com'
}

결과 문서에는 특정 고객의 모든 주문에 대한 세부 정보가 고객의 이메일 주소별로 그룹화되어 포함되어 있습니다.

이 튜토리얼의 전체 코드를 보려면 Github 에서 완료된 그룹 및 총 앱 을(를)Github 참조하세요.

돌아가기

필터링된 하위 집합