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

MongoDB에서 배열의 모든 요소가 특정 값을 가지는 문서 조회하는 방법

MongoDB에서 배열의 모든 요소가 특정 값을 가지는 문서 조회하기

MongoDB에서 배열 안의 모든 요소가 특정 값과 일치하는 문서만 골라내고 싶다면 find() 메서드에 $not, $elemMatch, $ne 연산자를 조합하여 사용할 수 있습니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

1단계: 샘플 데이터 생성

먼저 문서를 담을 컬렉션을 생성합니다. insertOne() 메서드를 사용해 두 개의 문서를 삽입해 보겠습니다.

> db.findDocumentsDemo.insertOne(
    {
       _id: 101,
       "ProductDetails": [
          { "ProductValue":100 },
          { "ProductValue":120 }
       ]
    }
);
{ "acknowledged" : true, "insertedId" : 101 }
> db.findDocumentsDemo.insertOne(
    {
       _id: 102,
       "ProductDetails": [
          { "ProductValue":120},
          { "ProductValue":120 },
          { "ProductValue":120 }
       ]
    }
);
{ "acknowledged" : true, "insertedId" : 102 }

위 예제에서 첫 번째 문서(_id: 101)는 ProductValue가 100과 120으로 서로 다르고, 두 번째 문서(_id: 102)는 세 요소가 모두 120으로 동일합니다.

2단계: 전체 문서 확인하기

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

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

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

{
    "_id" : 101,
    "ProductDetails" : [
        {
            "ProductValue" : 100
        },
        {
            "ProductValue" : 120
        }
    ]
}
{
    "_id" : 102,
    "ProductDetails" : [
        {
            "ProductValue" : 120
        },
        {
            "ProductValue" : 120
        },
        {
            "ProductValue" : 120
        }
    ]
}

3단계: 배열의 모든 요소가 특정 값인 문서 조회하기

이번에는 ProductDetails 배열의 모든 요소가 ProductValue 120을 가지는 문서만 조회해 보겠습니다. 핵심은 아래 두 조건을 동시에 적용하는 것입니다.

  • 배열 안에 ProductValue가 120인 요소가 최소 하나 이상 존재할 것
  • ProductValue가 120이 아닌 요소가 하나도 없을 것 ($not + $elemMatch + $ne)
> db.findDocumentsDemo.find({
    "ProductDetails.ProductValue" : 120,
    "ProductDetails" : {
       $not : {
          $elemMatch : {
             "ProductValue" : {
                $ne : 120
             }
          }
       }
    }
});

쿼리를 실행하면 세 요소가 모두 120인 문서(_id: 102)만 다음과 같이 반환됩니다.

{ "_id" : 102, "ProductDetails" : [ { "ProductValue" : 120 }, { "ProductValue" : 120 }, { "ProductValue" : 120 } ] }

동작 원리 정리

  • "ProductDetails.ProductValue": 120 — 점 표기법(dot notation)으로 배열 내 어느 한 요소라도 값이 120인지 확인합니다. 이 조건이 없으면 130처럼 다른 값으로만 구성된 문서도 결과에 포함될 수 있습니다.
  • $not: { $elemMatch: { ... } } — "120이 아닌 값을 가진 요소"가 존재하는 문서를 제외합니다. 즉, 하나라도 120 외의 값이 섞여 있으면 해당 문서는 조회 대상에서 제외됩니다.

이렇게 두 조건을 함께 사용하면 배열의 모든 요소가 정확히 지정한 값(여기서는 120)과 일치하는 문서만 깔끔하게 추출할 수 있습니다.