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

MongoDB에서 배열 객체 내 배열 요소의 값을 증가시키는 방법 ($inc 연산자)

MongoDB에서 배열 안에 포함된 객체의 특정 필드 값을 증가시키려면 $inc 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 요소의 값을 증가시키는 과정을 단계별로 살펴보겠습니다.

1. 테스트용 컬렉션 생성

먼저 문서(document)를 포함하는 컬렉션을 생성합니다. 아래 예제에서는 'details'라는 배열 필드 안에 여러 개의 객체(id와 Quantity)를 담은 문서를 삽입합니다.

> db.demo506.insertOne({"details":[{id:1,Quantity:4},{id:2,Quantity:3},{id:3,Quantity:2},{id:4,Quantity:7}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e882ed6987b6e0e9d18f576")
}

2. 컬렉션 데이터 확인

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

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

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

{
   "_id" : ObjectId("5e882ed6987b6e0e9d18f576"),
   "details" : [
      {
         "id" : 1,
         "Quantity" : 4
      },
      {
         "id" : 2,
         "Quantity" : 3
      },
      {
         "id" : 3,
         "Quantity" : 2
      },
      {
         "id" : 4,
         "Quantity" : 7
      }
   ]
}

3. $inc 연산자로 배열 요소의 값 증가시키기

이제 배열 객체 내 특정 요소의 Quantity 값을 증가시켜 보겠습니다. 핵심은 위치 연산자($)를 활용하는 것입니다. 조건에 일치하는 첫 번째 배열 요소를 가리키는 '$' 기호를 사용하면, 해당 위치의 필드 값만 정확하게 수정할 수 있습니다.

아래 쿼리는 id가 2인 배열 요소의 Quantity 값을 10만큼 증가시킵니다.

> db.demo506.update({"details.id":2},{$inc:{"details.$.Quantity":10}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과 nModified가 1로 표시되며, 하나의 문서가 성공적으로 수정되었음을 알 수 있습니다.

4. 업데이트 결과 확인

수정이 완료되었다면 다시 find() 메서드로 결과를 확인해 보겠습니다.

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

출력 결과를 보면 id가 2인 요소의 Quantity 값이 기존의 3에서 13으로 증가한 것을 확인할 수 있습니다.

{
   "_id" : ObjectId("5e882ed6987b6e0e9d18f576"),
   "details" : [
      {
         "id" : 1,
         "Quantity" : 4
      },
      {
         "id" : 2,
         "Quantity" : 13
      },
      {
         "id" : 3,
         "Quantity" : 2
      },
      {
         "id" : 4,
         "Quantity" : 7
      }
   ]
}

정리

MongoDB에서 배열 내 객체의 값을 증가시킬 때는 $inc 연산자와 함께 위치 연산자($)를 조합하면 됩니다. "details.$.Quantity"처럼 경로를 지정하면 조건에 매칭된 배열 요소의 해당 필드만 선택적으로 업데이트할 수 있습니다. 참고로 최신 MongoDB 버전에서는 update() 대신 updateOne(), updateMany() 메서드를 사용하는 것이 권장됩니다.