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)


MongoDB 관련 글

태그:

카테고리:

업데이트:

댓글남기기