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

MongoDB에서 배열의 하위 항목을 설정하는 방법 – 위치 연산자($) 활용하기

MongoDB에서 배열 안에 포함된 특정 하위 항목(sub-item)의 값을 수정하려면 위치 연산자($)를 사용할 수 있습니다. 이 연산자는 쿼리 조건과 일치하는 첫 번째 배열 요소를 자동으로 찾아 해당 위치의 값만 업데이트해 줍니다.

이번 글에서는 실제 예제를 통해 배열 내 하위 항목을 설정하는 과정을 단계별로 살펴보겠습니다.

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

먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 생성합니다.

> db.demo22.insertOne(
...    {
...       ProductId:101,
...       ProductDetails:
...       [
...           {
...               ProductFirstPrice: '35',
...               ProductSecondPrice: '75'
...           },
...           {
...               ProductFirstPrice: '',
...               ProductSecondPrice:''
...           },
...           {
...               ProductFirstPrice: '78',
...               ProductSecondPrice:'24'
...           }
...       ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14c0b422d07d3b95082e70")
}

위 문서는 ProductId와 세 개의 가격 정보(ProductDetails)를 배열 형태로 가지고 있으며, 두 번째 배열 요소는 값이 비어 있는 상태입니다.

2단계: find()로 전체 문서 조회

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.

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

이 명령은 다음과 같은 결과를 출력합니다.

{
    "_id" : ObjectId("5e14c0b422d07d3b95082e70"),
    "ProductId" : 101,
    "ProductDetails" : [
       {
           "ProductFirstPrice" : "35",
           "ProductSecondPrice" : "75"
       },
       {
           "ProductFirstPrice" : "",
           "ProductSecondPrice" : ""
       },
       {
           "ProductFirstPrice" : "78",
           "ProductSecondPrice" : "24"
       }
    ]
}

3단계: 위치 연산자($)로 배열 하위 항목 업데이트

다음은 배열 내 하위 항목을 설정하는 MongoDB 쿼리입니다.

> db.demo22.update({ "ProductDetails.ProductFirstPrice" : "35" },
... { $set : { "ProductDetails.$.ProductFirstPrice" : "" }}, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

여기서 핵심은 "ProductDetails.$" 부분입니다. $ 기호가 조건(ProductFirstPrice가 '35'인 요소)과 일치하는 배열 요소의 인덱스를 대신하며, 해당 요소의 ProductFirstPrice 값만 빈 문자열('')로 변경합니다.

  • nMatched : 1 — 조건과 일치한 문서 수
  • nModified : 1 — 실제로 수정된 문서 수

참고로 update() 호출 시 마지막에 전달한 false, true는 각각 upsert(문서가 없으면 생성)를 비활성화하고 multi(일치하는 모든 문서 업데이트)를 활성화하는 옵션입니다. 최신 MongoDB 버전에서는 이를 대체하는 updateOne(), updateMany() 사용이 권장됩니다.

4단계: 업데이트 결과 확인

다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인합니다.

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

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

{
    "_id" : ObjectId("5e14c0b422d07d3b95082e70"),
    "ProductId" : 101,
    "ProductDetails" : [
       {
           "ProductFirstPrice" : "",
           "ProductSecondPrice" : "75"
       },
       {
           "ProductFirstPrice" : "",
           "ProductSecondPrice" : ""
       },
       {
           "ProductFirstPrice" : "78",
           "ProductSecondPrice" : "24"
       }
    ]
}

첫 번째 배열 요소의 ProductFirstPrice가 '35'에서 ''(빈 문자열)로 성공적으로 변경된 것을 확인할 수 있습니다. 이처럼 위치 연산자 $를 활용하면 배열 전체를 다시 저장하지 않고도 조건과 일치하는 특정 요소만 효율적으로 업데이트할 수 있습니다.