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

MongoDB 문서 내 객체 배열에서 특정 객체만 조회하는 방법 ($ 위치 연산자 활용)

MongoDB에서 배열에 저장된 여러 객체 중 조건에 맞는 특정 객체 하나만 추출하고 싶을 때가 있습니다. 이럴 때 유용하게 사용할 수 있는 것이 바로 위치 연산자($)입니다. 위치 연산자를 사용하면 쿼리 조건과 일치하는 배열 요소만 선택적으로 반환받을 수 있습니다.

1. 테스트용 컬렉션 생성하기

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 고객 정보와 함께 구매 내역이 배열 형태로 저장된 구조입니다.

> db.getASpecificObjectDemo.insertOne(
...   {
...       _id : 1,
...       "CustomerName" : "Larry",
...       "CustomerDetails" : {
...           "CustomerPurchaseDescription": [{
...               id : 100,
...               "ProductName" : "Product-1",
...               "Amount": 10000
...           },{
...               id : 101,
...               "ProductName" : "Product-2",
...               "Amount": 10500
...           },
...           {
...               id : 102,
...               "ProductName" : "Product-3",
...               "Amount": 10200
...           }
...       ]
...   }
... );
{ "acknowledged" : true, "insertedId" : 1 }

2. 전체 문서 확인하기

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

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

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

{
    "_id" : 1,
    "CustomerName" : "Larry",
    "CustomerDetails" : {
        "CustomerPurchaseDescription" : [
            {
                "id" : 100,
                "ProductName" : "Product-1",
                "Amount" : 10000
            },
            {
                "id" : 101,
                "ProductName" : "Product-2",
                "Amount" : 10500
            },
            {
                "id" : 102,
                "ProductName" : "Product-3",
                "Amount" : 10200
            }
        ]
    }
}

3. 위치 연산자($)로 특정 객체만 가져오기

이제 핵심 부분입니다. _id가 1인 문서 안에서, 구매 내역 배열 중 id가 101인 객체만 골라서 조회하려면 아래와 같이 쿼리를 작성합니다.

> db.getASpecificObjectDemo.find({_id:1, "CustomerDetails.CustomerPurchaseDescription.id":101},{_id:0, "CustomerDetails.CustomerPurchaseDescription.$":1});

쿼리 구조를 살펴보면 다음과 같습니다.

- 첫 번째 인수(조건): _id:1로 대상 문서를 지정하고, 점 표기법으로 배열 내부 필드인 CustomerDetails.CustomerPurchaseDescription.id가 101인 요소를 찾습니다.
- 두 번째 인수(프로젝션): _id:0으로 _id 필드는 제외하고, 위치 연산자 $를 사용해 조건과 일치하는 배열 요소만 포함시킵니다.

실행 결과, 원하는 객체 하나만 정확히 반환되는 것을 확인할 수 있습니다.

{ "CustomerDetails" : { "CustomerPurchaseDescription" : [ { "id" : 101, "ProductName" : "Product-2", "Amount" : 10500 } ] } }

마무리

이처럼 MongoDB의 위치 연산자($)를 활용하면 배열 전체가 아닌, 쿼리 조건에 일치하는 특정 객체만 깔끔하게 조회할 수 있습니다. 배열 데이터가 많은 실무 환경에서 불필요한 데이터 전송을 줄이고 성능을 최적화하는 데 큰 도움이 되니 꼭 기억해 두세요.