MongoDB에서 MySQL UNION과 유사한 쿼리 구현하기
MySQL의 UNION은 여러 쿼리의 결과를 하나로 합쳐 주는 유용한 기능입니다. MongoDB에는 이에 직접 대응하는 연산자가 없지만, aggregate() 집계 파이프라인과 $lookup(JOIN)을 함께 사용하면 동일한 효과를 얻을 수 있습니다. 아래 예제를 통해 두 컬렉션을 결합하는 과정을 단계별로 살펴보겠습니다.
1단계: 첫 번째 컬렉션 생성
먼저 문서가 담긴 첫 번째 컬렉션을 생성합니다.
> db.demo486.insertOne({_id:1,"Amount":30,"No":4});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo486.insertOne({_id:2,"Amount":40,"No":2});
{ "acknowledged" : true, "insertedId" : 2 }
> db.demo486.insertOne({_id:3,"Amount":60,"No":6});
{ "acknowledged" : true, "insertedId" : 3 }find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo486.find();
위 명령은 다음과 같은 결과를 출력합니다.
{ "_id" : 1, "Amount" : 30, "No" : 4 }
{ "_id" : 2, "Amount" : 40, "No" : 2 }
{ "_id" : 3, "Amount" : 60, "No" : 6 }2단계: 두 번째 컬렉션 생성
이어서 두 번째 컬렉션을 생성합니다.
> db.demo487.insertOne({_id:1,"Price":10,"No":4});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo487.insertOne({_id:2,"Price":80,"No":9});
{ "acknowledged" : true, "insertedId" : 2 }
> db.demo487.insertOne({_id:3,"Price":20,"No":6});
{ "acknowledged" : true, "insertedId" : 3 }마찬가지로 find() 메서드로 전체 문서를 확인합니다.
> db.demo487.find();
실행 결과는 다음과 같습니다.
{ "_id" : 1, "Price" : 10, "No" : 4 }
{ "_id" : 2, "Price" : 80, "No" : 9 }
{ "_id" : 3, "Price" : 20, "No" : 6 }3단계: UNION과 유사한 쿼리 작성
아래는 MongoDB에서 두 쿼리를 UNION하듯 결합하는 쿼리입니다.
> db.getCollection('demo486').aggregate([
... {$lookup : { from : "demo487",localField : "No", foreignField :"No", as:"demo487"}},
... {$unwind : "$demo487"},
... {
... $group : {
... _id : {
... No :"$No",
... },
... TotalValue : { $sum : { $add: [ "$Amount", "$demo487.Price" ] }}
... }
... },
... {$sort : {"_id.No":1}},
... {
... $project : {
... No :"$_id.No",
... TotalValue : 1,
... _id : 0
... }
... }
... ])각 파이프라인 단계의 역할은 다음과 같습니다.
- $lookup: demo487 컬렉션과 No 필드를 기준으로 조인(JOIN)을 수행합니다.
- $unwind: 조인 결과로 생성된 배열을 개별 문서로 펼쳐 줍니다.
- $group: No 값을 기준으로 문서를 그룹화하고, Amount와 Price의 합을 TotalValue로 계산합니다.
- $sort: No 필드를 오름차순으로 정렬합니다.
- $project: 최종 출력에 포함할 필드를 지정합니다.
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "TotalValue" : 40, "No" : 4 }
{ "TotalValue" : 80, "No" : 6 }No가 4인 문서는 Amount(30)와 Price(10)가 더해져 40이 되고, No가 6인 문서는 60과 20이 더해져 80이 됩니다. 이처럼 $lookup과 aggregate()를 활용하면 관계형 데이터베이스의 UNION 및 JOIN에 해당하는 로직을 MongoDB에서도 손쉽게 구현할 수 있습니다.