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

MongoDB에서 특정 값보다 큰 배열 요소를 가진 문서 조회하기 – $elemMatch 활용법

MongoDB에서 배열 필드 내 요소 중 하나라도 특정 값보다 큰 경우 해당 문서를 조회하려면 $elemMatch 연산자를 사용하면 됩니다.

$elemMatch란?

$elemMatch 연산자는 배열 필드에 지정된 모든 쿼리 조건을 만족하는 요소가 최소 하나 이상 포함되어 있는 문서를 매칭합니다. 단순 비교 연산자만 사용하는 것과 달리, 배열의 각 요소에 대해 여러 조건을 동시에 적용할 수 있어 더욱 정교한 검색이 가능합니다.

예제용 컬렉션 생성

먼저 실습에 사용할 컬렉션과 문서를 생성해 보겠습니다.

> db.demo701.insertOne({"ListOfValues":[100,200,300]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e8cf551299a9f98c93b0")
}
> db.demo701.insertOne({"ListOfValues":[500,700,1000]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e8d8551299a9f98c93b1")
}
> db.demo701.insertOne({"ListOfValues":[300,350,450]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e8e1551299a9f98c93b2")
}

저장된 전체 문서 확인하기

find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회합니다.

> db.demo701.find();

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

{ "_id" : ObjectId("5ea6e8cf551299a9f98c93b0"), "ListOfValues" : [ 100, 200, 300 ] }
{ "_id" : ObjectId("5ea6e8d8551299a9f98c93b1"), "ListOfValues" : [ 500, 700, 1000 ] }
{ "_id" : ObjectId("5ea6e8e1551299a9f98c93b2"), "ListOfValues" : [ 300, 350, 450 ] }

특정 값보다 큰 배열 값을 가진 문서 조회 쿼리

이제 $elemMatch와 $gt(초과) 연산자를 조합하여, 배열 내 요소 중 500보다 큰 값이 하나라도 있는 문서를 조회하는 쿼리를 작성해 보겠습니다.

> db.demo701.find({"ListOfValues":{$elemMatch:{$gt:500}}});

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

{ "_id" : ObjectId("5ea6e8d8551299a9f98c93b1"), "ListOfValues" : [ 500, 700, 1000 ] }

결과 분석

출력 결과를 살펴보면 두 번째 문서만 반환되었습니다. 그 이유는 다음과 같습니다.

  • 첫 번째 문서 [100, 200, 300]: 500보다 큰 요소가 없으므로 제외됩니다.
  • 두 번째 문서 [500, 700, 1000]: 700과 1000이 500보다 크므로 조건을 충족하여 반환됩니다.
  • 세 번째 문서 [300, 350, 450]: 가장 큰 값이 450으로 500을 초과하지 않으므로 제외됩니다.

참고 사항

배열 필드에 단일 조건만 적용하는 경우에는 {"ListOfValues": {$gt: 500}}처럼 $elemMatch 없이도 동일한 결과를 얻을 수 있습니다. 하지만 {$gt: 500, $lt: 800}처럼 여러 조건을 하나의 요소에 동시에 적용해야 할 때는 반드시 $elemMatch를 사용해야 합니다. $elemMatch를 사용하지 않으면 각 조건이 서로 다른 요소에 개별적으로 적용되어 의도와 다른 결과가 나올 수 있습니다.