MongDB(NoSQL)에서 RDBMS의 Join 활용

beluga000·2024년 7월 31일
post-thumbnail

MongoDB

MongoDB는 NoSQL을 대표하는 DB로써 RDBMS와 상반되게 Json과 같은 동적 스키마형 도큐먼트들을 선호한다.

동적 스키마형 도큐먼트들 : MongoDB는 이러한 포맷을 BSON이라고 부른다.

MongoDB의 Join

RDBMS에서 사용하는 join과 유사한 기능을 수행하기 위해서 MongoDB에서는 Aggregation Pipeline$lookup을 사용할 수 있습니다.

예를 들어 2개의 컬렉션 orders과 products가 있다고 가정합니다.

orders 컬렉션

{ "_id": 1, "product_id": 1, "quantity": 2 }
{ "_id": 2, "product_id": 2, "quantity": 1 }

products 컬렉션

{ "_id": 1, "name": "Widget", "price": 25 }
{ "_id": 2, "name": "Gadget", "price": 100 }

$lookup을 사용하여 orders 컬렉션에 products 데이터를 조인하는 방법(Mongo Shell)

db.orders.aggregate([
    {
        $lookup:
        {
            from: "products",
            localField: "product_id",
            foreignField: "_id",
            as: "product_details"
        }
    }
])

위 스크립트 실행 시 orders 컬렉션에 product_details라는 배열 필드가 추가됩니다.

{
    "_id": 1,
    "product_id": 1,
    "quantity": 2,
    "product_details": [
        { "_id": 1, "name": "Widget", "price": 25 }
    ]
}
{
    "_id": 2,
    "product_id": 2,
    "quantity": 1,
    "product_details": [
        { "_id": 2, "name": "Gadget", "price": 100 }
    ]
}

Python에서 pymongo를 사용하여 해당 작업을 수행하는 방법은 아래와 같습니다.

from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.my_database

# 예시 데이터 삽입
db.orders.insert_many([
    { "_id": 1, "product_id": 1, "quantity": 2 },
    { "_id": 2, "product_id": 2, "quantity": 1 }
])

db.products.insert_many([
    { "_id": 1, "name": "Widget", "price": 25 },
    { "_id": 2, "name": "Gadget", "price": 100 }
])

# $lookup 사용 예시
pipeline = [
    {
        "$lookup": {
            "from": "products",
            "localField": "product_id",
            "foreignField": "_id",
            "as": "product_details"
        }
    }
]

result = db.orders.aggregate(pipeline)

for doc in result:
    print(doc)

위 코드는 orders 컬렉션과 products 컬렉션을 product_id와 _id를 기준으로 조인하고, 결과를 출력합니다.

profile
Developer

0개의 댓글