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

MongoDB에서 배열 요소를 필터링하는 방법 – $setIntersection 연산자 완벽 가이드

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이 가장 간단하고 직관적인 해결책입니다.