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

MongoDB에서 범위 조건의 쿼리와 필터로 문서 내 특정 배열 요소를 조회하는 방법

MongoDB에서 범위 조건으로 배열 요소 조회하기

MongoDB 문서 내 배열 필드에서 특정 조건(예: 가격이 600 초과, 900 미만)을 만족하는 요소만 골라내려면 aggregate() 파이프라인과 $match, $addFields, $filter 연산자를 함께 사용하면 됩니다. 아래 예제를 통해 전체 과정을 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 데모용 컬렉션을 만들고 상품 정보가 담긴 문서 두 개를 삽입합니다. 각 문서에는 상품 상세 정보(ProductDetails)가 배열 형태로 저장되어 있습니다.

> db.demo351.insertOne(
... {
...    "_id" : "101",
...    "ProductDetails" : [
...       {
...          "ProductName" : "Product-1",
...          "ProductPrice" : 500
...       },
...       {
...          "ProductName" : "Product-2",
...          "ProductPrice" : 400
...       }
...    ]
... }
... );
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo351.insertOne(
... {
...    "_id" : "102",
...    "ProductDetails" : [
...       {
...          "ProductName" : "Product-3",
...          "ProductPrice" : 200
...       },
...       {
...          "ProductName" : "Product-4",
...          "ProductPrice" : 800
...       }
...    ]
... }
... );
{ "acknowledged" : true, "insertedId" : "102" }

2단계: 저장된 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

> db.demo351.find();

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

{
   "_id" : "101", "ProductDetails" : [
      { "ProductName" : "Product-1", "ProductPrice" : 500 },
      { "ProductName" : "Product-2", "ProductPrice" : 400 }
   ]
}
{
   "_id" : "102", "ProductDetails" : [
      { "ProductName" : "Product-3", "ProductPrice" : 200 },
      { "ProductName" : "Product-4", "ProductPrice" : 800 }
   ]
}

3단계: 범위 조건이 적용된 집계 쿼리 실행

다음은 _id가 "102"인 문서를 대상으로, ProductPrice가 600보다 크고 900보다 작은 배열 요소만 필터링하는 쿼리입니다.

> db.demo351.aggregate([
...    {
...       $match: { _id: "102" }
...    },
...    {
...       $addFields: {
...          ProductDetails: {
...             $filter: {
...                input: "$ProductDetails",
...                cond: {
...                   $and: [
...                      { $gt: [ "$$this.ProductPrice", 600 ] },
...                      { $lt: [ "$$this.ProductPrice", 900 ] }
...                   ]
...                }
...             }
...          }
...       }
...    }
... ])

4단계: 실행 결과 확인

{ "_id" : "102", "ProductDetails" : [ { "ProductName" : "Product-4", "ProductPrice" : 800 } ] }

쿼리 동작 원리

  • $match: _id가 "102"인 문서만 파이프라인으로 전달해 불필요한 문서 처리를 줄입니다.
  • $addFields: 기존 ProductDetails 필드를 새로 계산된 값으로 덮어씁니다.
  • $filter: 배열의 각 요소($$this)를 순회하며 cond 조건을 평가하고, 조건을 통과한 요소만 남긴 새 배열을 반환합니다.
  • $gt / $lt: 각각 '초과', '미만' 비교를 수행하며, $and로 묶어 600~900 사이라는 범위 조건을 완성합니다.

결과적으로 Product-4(가격 800) 하나만 조건을 충족하므로 해당 요소만 포함된 배열이 최종 출력됩니다. 이 방식은 단순한 위치 연산자 기반 조회보다 유연하게 복잡한 조건을 배열 요소에 적용할 수 있다는 장점이 있으며, 대량의 데이터에서 조건부 배열 필터링이 필요할 때 특히 유용합니다.