Docs Home โ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ โ Python ๋๋ผ์ด๋ฒ โ 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)
ํํ ๋ฆฌ์ผ
2020๋ ์ฃผ๋ฌธ์ ๋งค์น ๋จ๊ณ ์ถ๊ฐ
๋จผ์ 2020 ์ ์ ์๋ ์ฃผ๋ฌธ๊ณผ ์ผ์นํ๋ $match ๋จ๊ณ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
pipeline.append({ "$match": { "orderdate": { "$gte": datetime(2020, 1, 1, 0, 0, 0), "$lt": datetime(2021, 1, 1, 0, 0, 0) } } })
์ฃผ๋ฌธ ๋ ์ง๋ณ๋ก ์ ๋ ฌํ๋ sort ๋จ๊ณ๋ฅผ ์ถ๊ฐํฉ๋๋ค
๋ค์์ผ๋ก, $sort ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ฌ orderdate
ํ๋์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ์ค์ ํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๊ฐ์ฅ ์ด๋ฅธ 2020 ๊ตฌ๋งค๋ฅผ ๋ค์ ๋จ๊ณ์์ ํ์ํฉ๋๋ค.
pipeline.append({ "$sort": { "orderdate": 1 } })
์ด๋ฉ์ผ ์ฃผ์๋ณ๋ก ๊ทธ๋ฃนํํ ๊ทธ๋ฃน ๋จ๊ณ ์ถ๊ฐ
$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"}} } })
์ฒซ ์ฃผ๋ฌธ ๋ ์ง๋ณ๋ก ์ ๋ ฌํ๋ ์ ๋ ฌ ๋จ๊ณ ์ถ๊ฐ
๋ค์์ผ๋ก, ๋ค๋ฅธ $sort ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ฌ first_purchase_date
ํ๋์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ์ค์ ํฉ๋๋ค.
pipeline.append({ "$sort": { "first_purchase_date": 1 } })
์ด๋ฉ์ผ ์ฃผ์๋ฅผ ํ์ํ๋ ๋จ๊ณ ์ถ๊ฐ
$set ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ฌ $group
๋จ๊ณ์์ ์ค์ ํ _id
ํ๋์ ๊ฐ์์ customer_id
ํ๋๋ฅผ ๋ค์ ๋ง๋ญ๋๋ค.
pipeline.append({ "$set": { "customer_id": "$_id" } })
์ค์ ๋์ง ์์ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ฌ ๋ถํ์ํ ํ๋ ์ ๊ฑฐ
๋ง์ง๋ง์ผ๋ก $unset ๋จ๊ณ๋ฅผ ์ถ๊ฐํฉ๋๋ค. $unset
๋จ๊ณ๋ ๊ฒฐ๊ณผ ๋ฌธ์์์ _id
ํ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
pipeline.append({"$unset": ["_id"]})
์ง๊ณ ํ์ดํ๋ผ์ธ์ ์คํํฉ๋๋ค.
orders
collection์์ ์ ๊ทธ๋ฆฌ๊ฒ์ด์
์ ์ํํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์
๋์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ธ์.
aggregation_result = orders_coll.aggregate(pipeline)
๋ง์ง๋ง์ผ๋ก shell์์ ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํฉ๋๋ค.
python3 agg_tutorial.py
๊ฒฐ๊ณผ ํด์
์ด ์ ๊ทธ๋ฆฌ๊ฒ์ด์ ์ 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 ์ฐธ์กฐํ์ธ์. ์์ .