Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 MySQL UNION과 유사한 쿼리 구현하는 방법

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에서도 손쉽게 구현할 수 있습니다.