PyMongo Aggregation Examples
aggregate() 메서드를 이용해 MongoDB의 Collection에 존재하는 Documents들을 집계할 수 있다.
MongoDB 관련 글
예제 데이터 준비
from pymongo import MongoClient
# MongoDB 클라이언트 인스턴스 생성
client = MongoClient(
host = "localhost",
port = 27017,
username = "root",
password = "password",
)
# 테스트 DB 정의
db = client.test_db
# 데이터 리스트 정의
data = [
{"x": 1, "tags": ["dog", "cat"]},
{"x": 2, "tags": ["cat"]},
{"x": 2, "tags": ["mouse", "cat", "dog"]},
{"x": 3, "tags": []},
]
# things 컬렉션에 데이터 벌크 인서트 수행
result = db.things.insert_many(data)
# 추가된 Documents의 ID 확인
result.inserted_ids
[ObjectId('61b82aaec6da68c6dbb10801'),
ObjectId('61b82aaec6da68c6dbb10802'),
ObjectId('61b82aaec6da68c6dbb10803'),
ObjectId('61b82aaec6da68c6dbb10804')]
집계 프레임워크
aggregate()메서드를 통해 Collection에 존재하는 모든 tags 항목에 대해 각 tag의 포함 횟수를 집계할 수 있다. 집계 전 pipeline에 세 가지 조건을 추가해야 한다. 먼저, 태그 배열을 풀고 태그별로 그룹화한 후에 합산해야 한다. 그 다음 갯수를 기준으로 정렬한다.
파이썬 딕셔너리는 순서를 유지하지 않기 때문에 SON이나 collections.OrderedDict를 사용해야 한다.
from bson.son import SON
pipeline = [
{"$unwind": "$tags"},
{"$group": {"_id": "$tags", "count": {"$sum": 1}}},
{"$sort": SON([("count", -1), ("_id", -1)])}
]
import pprint
pprint.pprint(list(db.things.aggregate(pipeline)))
[{'_id': 'cat', 'count': 3},
{'_id': 'dog', 'count': 2},
{'_id': 'mouse', 'count': 1}]
집계 실행 계획을 보려면 아래와 같이 command() 메서드를 호출한다.
db.command("aggregate", "things", pipeline=pipeline, explain=True)
댓글남기기