MongoDB는 NoSQL을 대표하는 DB로써 RDBMS와 상반되게 Json과 같은 동적 스키마형 도큐먼트들을 선호한다.
동적 스키마형 도큐먼트들 : MongoDB는 이러한 포맷을 BSON이라고 부른다.
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를 기준으로 조인하고, 결과를 출력합니다.