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

MongoDB에서 $elemMatch로 여러 조건을 만족하는 두 개의 배열 값을 가진 문서 조회하기

배열 필드 안의 요소들이 서로 다른 여러 조건을 동시에 만족하는 문서를 조회해야 할 때가 있습니다. 이럴 때는 MongoDB의 $elemMatch 연산자를 사용하면 됩니다. $elemMatch는 하나의 배열 요소가 지정한 모든 조건을 충족하는지 검사할 수 있게 해주는 강력한 쿼리 연산자입니다.

테스트용 컬렉션 생성하기

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.findDocumentsHaving2Demo.insertOne(
   {_id : 101, Values: [78,98]}
);
{ "acknowledged" : true, "insertedId" : 101 }
> db.findDocumentsHaving2Demo.insertOne(
   {_id :102, Values : [89,102]}
);
{ "acknowledged" : true, "insertedId" : 102 }

저장된 전체 문서 확인하기

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

> db.findDocumentsHaving2Demo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : 101, "Values" : [ 78, 98 ] }
{ "_id" : 102, "Values" : [ 89, 102 ] }

여러 조건을 만족하는 배열 값을 가진 문서 조회하기

이제 핵심 부분입니다. 아래 쿼리는 배열에 정확히 두 개의 값이 있으면서, 각각이 서로 다른 범위 조건을 만족하는 문서를 찾습니다.

> db.findDocumentsHaving2Demo.find({$and: [
   {Values: {$elemMatch: {$gte: 77, $lte: 78}}},
   {Values: {$elemMatch: {$gte:90 , $lte: 110}}},
   {'Values.2': {$exists: false}}
]});

실행 결과는 다음과 같습니다.

{ "_id" : 101, "Values" : [ 78, 98 ] }

쿼리 로직 상세 설명

이 쿼리가 의도대로 동작하는 이유를 단계별로 살펴보겠습니다.

첫 번째 조건: {Values: {$elemMatch: {$gte: 77, $lte: 78}}} — Values 배열 중 하나의 요소가 77 이상 78 이하여야 합니다. 첫 번째 문서의 값 78이 이 조건을 충족합니다.

두 번째 조건: {Values: {$elemMatch: {$gte: 90, $lte: 110}}} — 별도의 다른 요소가 90 이상 110 이하여야 합니다. 첫 번째 문서의 값 98이 해당됩니다.

세 번째 조건: {'Values.2': {$exists: false}} — 인덱스 2번 위치, 즉 세 번째 요소가 존재하지 않아야 합니다. 이 조건 덕분에 배열의 길이가 정확히 2인 문서만 걸러집니다.

결과적으로 _id가 101인 문서만 두 조건을 모두 만족하므로 유일하게 반환되며, _id가 102인 문서([89, 102])는 77~78 범위의 값을 가지지 않아 제외됩니다. 이처럼 $and와 $elemMatch, $exists를 조합하면 배열 내 개별 요소에 대한 복잡한 다중 조건 검색도 손쉽게 구현할 수 있습니다.