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

MongoDB 배열에서 동일한 값이 여러 번 포함된 문서를 찾는 방법 ($where 활용)

배열 안에 동일한 값이 두 번 이상 들어 있는 문서를 찾아야 하는 경우가 종종 있습니다. 이럴 때 MongoDB의 $where 연산자와 JavaScript 함수를 조합하면 간단하게 해결할 수 있습니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성 및 데이터 삽입

먼저 테스트용 컬렉션을 만들고 문서를 삽입합니다. 첫 번째 문서에는 값 100이 두 번 포함되어 있고, 두 번째 문서에는 한 번만 포함되어 있어 비교하기 좋습니다.

> db.demo188.insertOne(
...   {
...      "ListOfData":[
...         {"Data": 100},
...         {"Data": 200},
...         {"Data": 100}
...      ]
...   }
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ad1c203d395bdc21346bd")
}
> db.demo188.insertOne(
...   {
...      "ListOfData":[
...         {"Data": 100},
...         {"Data": 200},
...         {"Data": 300}
...      ]
...   }
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ad1c203d395bdc21346be")
}

2. 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo188.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e3ad1c203d395bdc21346bd"), "ListOfData" : [ { "Data" : 100 }, { "Data" : 200 }, { "Data" : 100 } ] }
{ "_id" : ObjectId("5e3ad1c203d395bdc21346be"), "ListOfData" : [ { "Data" : 100 }, { "Data" : 200 }, { "Data" : 300 } ] }

3. $where로 배열 내 중복 값 검색하기

다음은 $where 연산자를 사용해 배열(ListOfData) 안에서 값 100이 두 번 이상 등장하는 문서만 필터링하는 쿼리입니다. JavaScript의 filter() 함수로 조건에 맞는 요소의 개수를 세고, 그 개수가 1보다 큰지 판별하는 방식입니다.

> db.demo188.find({
...   "$where": function() {
...      return this.ListOfData.filter(function(d) {
...         return d.Data == 100;
...      }).length > 1;
...   }
...})

쿼리 실행 결과, 값 100이 두 번 포함된 첫 번째 문서만 반환됩니다.

{ "_id" : ObjectId("5e3ad1c203d395bdc21346bd"), "ListOfData" : [ { "Data" : 100 }, { "Data" : 200 }, { "Data" : 100 } ] }

참고 사항

$where 연산자는 각 문서마다 JavaScript 코드를 실행하며 인덱스를 활용하지 못하기 때문에, 데이터 양이 많은 컬렉션에서는 성능 저하가 발생할 수 있습니다. 따라서 소규모 데이터나 임시 분석 용도로 활용하는 것이 좋으며, 대량 데이터를 다룰 때는 애플리케이션 레벨에서 처리하거나 집계 파이프라인($unwind, $group 등)을 검토하는 편이 더 효율적입니다.