MongoDB에서 배열 교집합 데이터 구하기
MongoDB에서 두 배열 간의 교집합(공통 요소) 데이터를 얻으려면 aggregate() 집계 파이프라인 내에서 $setIntersection 연산자를 사용하면 됩니다. 이 연산자는 입력으로 받은 여러 배열을 비교하여 공통으로 존재하는 값들만 중복 없이 반환합니다.
이번 글에서는 실제 예제를 통해 컬렉션 생성부터 교집합 조회까지 전 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 demo625라는 컬렉션을 만들고 학생 이름과 점수 배열을 포함한 문서들을 삽입합니다.
> db.demo625.insertOne(
... {
... Name: "John",
... Marks: [56,98,60]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9ab8e16c954c74be91e6aa")
}
> db.demo625.insertOne(
... {
... Name: "John",
... Marks: [110,56,72]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9ab8e26c954c74be91e6ab")
}
> db.demo625.insertOne(
... {
... Name: "Chris",
... Marks: [90,91]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9ab8e26c954c74be91e6ac")
}
> db.demo625.insertOne(
... {
... Name: "Robert",
... Marks: [60,75]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9ab8e26c954c74be91e6ad")
}2단계: find() 메서드로 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 화면에 출력할 수 있습니다.
> db.demo625.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e9ab8e16c954c74be91e6aa"), "Name" : "John", "Marks" : [ 56, 98, 60 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ab"), "Name" : "John", "Marks" : [ 110, 56, 72 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ac"), "Name" : "Chris", "Marks" : [ 90, 91 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ad"), "Name" : "Robert", "Marks" : [ 60, 75 ] }3단계: $setIntersection으로 배열 교집합 조회하기
이제 aggregate() 파이프라인에서 $project 단계와 함께 $setIntersection을 사용하여, 각 문서의 Marks 배열과 기준 배열 [56, 98, 60] 사이의 교집합을 구해 보겠습니다.
> db.demo625.aggregate([
...
...
... { "$project": {
... "Name": 1,
... "Marks": {
... "$setIntersection": [ "$Marks", [56,98,60] ]
... }
... }}
... ])쿼리 실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e9ab8e16c954c74be91e6aa"), "Name" : "John", "Marks" : [ 56, 60, 98 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ab"), "Name" : "John", "Marks" : [ 56 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ac"), "Name" : "Chris", "Marks" : [ ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ad"), "Name" : "Robert", "Marks" : [ 60 ] }결과 분석
- 첫 번째 문서(John): 원래 배열이 [56, 98, 60]이므로 기준 배열과 완전히 일치하여 세 값이 모두 반환되었습니다.
- 두 번째 문서(John): [110, 56, 72] 중 기준 배열과 겹치는 값은 56 하나뿐입니다.
- 세 번째 문서(Chris): [90, 91]은 기준 배열과 공통 요소가 없어 빈 배열이 반환되었습니다.
- 네 번째 문서(Robert): [60, 75] 중 기준 배열과 겹치는 값은 60입니다.
참고로 $setIntersection은 결과를 항상 오름차순으로 정렬하고 중복 값을 제거한다는 점도 기억해 두면 유용합니다. 이처럼 $setIntersection을 활용하면 복잡한 애플리케이션 로직 없이도 MongoDB 쿼리만으로 배열 간 공통 요소를 손쉽게 추출할 수 있습니다.