MongoDB에서 배열에 저장된 값 중 원하는 요소만 골라내고 싶다면 집계 프레임워크(aggregate framework)와 함께 $setIntersection 연산자를 사용하면 됩니다. $setIntersection은 두 배열의 교집합을 반환하는 연산자이기 때문에, 배열에서 특정 값들만 추출할 때 매우 유용하게 활용됩니다.
이 글에서는 실제 예제를 통해 MongoDB에서 배열 요소를 필터링하는 전체 과정을 단계별로 살펴보겠습니다.
1단계: 테스트용 컬렉션 생성
먼저 예제에 사용할 컬렉션을 만들고 숫자 배열이 포함된 문서를 하나 삽입합니다.
> db.filterArrayElementsDemo.insertOne(
... { "Scores": [10,45,67,78,90,98,99,92] }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2d582b64f4b851c3a13c8")
}2단계: 저장된 문서 확인
find() 메서드를 사용해 컬렉션에 저장된 문서를 조회해 보겠습니다.
> db.filterArrayElementsDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd2d582b64f4b851c3a13c8"),
"Scores" : [
10,
45,
67,
78,
90,
98,
99,
92
]
}Scores 필드에는 총 8개의 숫자가 배열 형태로 저장되어 있습니다.
3단계: $setIntersection으로 배열 요소 필터링
이제 집계 파이프라인에서 $match로 대상 문서를 먼저 선택한 뒤, $project와 $setIntersection을 조합하여 Scores 배열에서 원하는 값(10, 98, 99)만 추출해 보겠습니다.
> db.filterArrayElementsDemo.aggregate([
... { $match : {
... _id: ObjectId("5cd2d582b64f4b851c3a13c8")
... }},
... { $project: {
... Scores: {
... $setIntersection: ['$Scores', [10,98,99]]
... }
... }}
... ]);쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5cd2d582b64f4b851c3a13c8"), "Scores" : [ 10, 98, 99 ] }결과 분석 및 핵심 포인트
실행 결과를 보면 원래 8개였던 배열이 지정한 세 개의 값 [10, 98, 99]만 남은 것을 확인할 수 있습니다.
- $match: 집계 파이프라인에서 처리할 문서를 먼저 선별하여 불필요한 연산을 줄입니다.
- $project: 출력할 필드를 지정하며, 여기서 Scores 필드를 변환된 값으로 대체합니다.
- $setIntersection: 첫 번째 배열($Scores)과 두 번째 배열([10,98,99])의 교집합을 반환합니다. 집합(set) 개념으로 동작하므로 중복 값은 자동으로 제거되며, 결과 내 요소 순서는 보장되지 않습니다.
참고로 조건 기반 필터링(예: 80점 이상인 값만 추출)이 필요하다면 $setIntersection 대신 $filter 연산자를 사용하는 것이 더 적합합니다. 반면, 특정 값 목록과 일치하는 요소만 뽑아낼 때는 $setIntersection이 가장 간단하고 직관적인 해결책입니다.