회사에서 뉴스관련 DB를 대용량 데이터베이스 처리에 적합한 Nosql중에 MongoDB를 사용하고 있다.
그래서 요새는 일과후나 주말에 MongoDB 공부에 전념하고 있다.
MongoDB 서적은 역시 국룰인 오라일리의 "몽고 DB 완벽가이드" 로 시작을 하였다.
역시 국룰인데는 이유가 있다. 강추..!!
아직은 서적 1회독에 인강 좀 끄적인 상태라서 몽고DB가 뭔지 대략적으로만 아는 상태인데
이거...공부를 할수록 매력있는것 같다. 개인적으로 Mysql보다 깊게 파보고 싶어졌다.
서론이 길었지만... 무튼 본론으로 돌아와서
MongoDB에서 Join을 사용해야만 하는 상황이 생겼다.
MongoDB와 같은 NoSql 데이터 베이스는
기존 관계형 데이터베이스와 다른 데이터 모델을 사용하기 때문에 조인에 대한 기본 지원을 제공하지 않는다.
NoSQL 데이터베이스는 테이블과 행을 사용하여 데이터를 저장하는 대신 컬렉션과 도큐먼트를 사용한다.
여러 컬렉션 또는 샤드에서 조인 작업을 수행하는 것은 어려울 수 있으며 성능 문제가 발생할 수 있습니다.
그러나 비정규화 및 조인을 사용하여 컬렉션 간의 관계를 나타내는 것과 같이 조인 작업에 대한 다른 대안을 제공한다.
그 대안은 Aggregation 파이프 라인연산자 $lookup이다
$lookup 은 쉽게말해서 관계형 데이터 베이스에서의 Left outer join 이라고 생각하면 된다.
주문과 고객인 예제 코드로 보자.
//orderscollection[
{
"_id": 1,
"product": "iPhone",
"customer_id": 101
},
{
"_id": 2,
"product": "Macbook Pro",
"customer_id": 102
},
{
"_id": 3,
"product": "iPad",
"customer_id": 101
}
]
//customerscollection[
{
"_id": 101,
"name": "John",
"email": "john@example.com"
},
{
"_id": 102,
"name": "Jane",
"email": "jane@example.com"
}
]
db.orders.aggregate([
{
$lookup:
{
from: "customers",
localField: "customer_id",
foreignField: "_id",
as: "customer"
}
}
])
이 쿼리는 $lookup 연산자를 사용하여 주문 컬렉션을 고객 컬렉션과 조인한다.
하나씩 설명하자면
from 필드는 조인할 컬렉션을 지정하고,
localField는 일치시킬 orders 컬렉션의 필드를 지정하고,
foreignField는 일치시킬 customers 컬렉션의 필드를 지정하고,
as는 조인 결과를 포함할 필드이다.
해당 쿼리의 출력을 확인해보면
[
{
"_id": 1,
"product": "iPhone",
"customer_id": 101,
"customer": [
{
"_id": 101,
"name": "John",
"email": "john@example.com"
}
]
},
{
"_id": 2,
"product": "Macbook Pro",
"customer_id": 102,
"customer": [
{
"_id": 102,
"name": "Jane",
"email": "jane@example.com"
}
]
},
{
"_id": 3,
"product": "iPad",
"customer_id": 101,
"customer": [
{
"_id": 101,
"name": "John",
"email": "john@example.com"
}
]
}
]
고객 필드에는 이제 고객 customer_id 필드를 기반으로 각 주문에 대한 고객 세부정보를 확인할 수 있다.
'Database > MongoDB' 카테고리의 다른 글
[MongoDB] Mac에서 MongoDB 완전히 삭제하는 법 (0) | 2023.02.07 |
---|