MongoDB에서 배열 객체 내 요소의 속성 값 증가시키기
MongoDB에서 배열(Array) 안에 포함된 특정 요소의 속성 값을 증가시키려면 update() 메서드와 $inc 연산자를 함께 사용하면 됩니다. 이때 위치 연산자($)를 활용하면 조건에 일치하는 배열 요소만 정확하게 찾아 값을 수정할 수 있습니다.
이번 글에서는 실제 예제를 통해 배열 객체 내 요소의 속성 값을 증가시키는 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 문서를 포함하는 컬렉션을 생성합니다. 아래 예제에서는 학생 이름과 점수(Marks)를 담은 'Details' 배열 필드를 가진 문서를 삽입합니다.
> db.demo97.insertOne({
... "Details": [
... {
... "Name": "Chris",
... "Marks": 45
... },
... {
... "Name": "Bob",
... "Marks": 88
... }
... ]
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2d6d24b8903cdd865577af")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo97.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e2d6d24b8903cdd865577af"), "Details" : [ { "Name" : "Chris", "Marks" : 45 }, { "Name" : "Bob", "Marks" : 88 } ] }3. $inc 연산자로 속성 값 증가시키기
이제 배열 객체 내 특정 요소의 속성 값을 증가시키는 핵심 쿼리를 살펴보겠습니다. 아래 예제에서는 이름이 'Bob'인 요소를 찾아 해당 요소의 'Marks' 값을 10만큼 증가시킵니다.
> db.demo97.update(
... { "Details.Name": "Bob" },
... { $inc: { "Details.$.Marks": 10 } }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
여기서 핵심은 두 가지입니다.
$inc 연산자: 지정한 숫자만큼 필드 값을 증가(음수 입력 시 감소)시킵니다.
위치 연산자($): 쿼리 조건과 일치하는 첫 번째 배열 요소를 가리켜, 해당 요소의 필드만 정확히 수정합니다.
4. 업데이트 결과 확인하기
업데이트가 완료되었으므로 다시 find() 메서드로 문서를 조회하여 변경 사항을 확인합니다.
> db.demo97.find();
실행 결과를 보면 'Bob'의 Marks 값이 88에서 98로 10 증가한 것을 확인할 수 있습니다. 반면 'Chris'의 값은 그대로 45로 유지됩니다.
{ "_id" : ObjectId("5e2d6d24b8903cdd865577af"), "Details" : [ { "Name" : "Chris", "Marks" : 45 }, { "Name" : "Bob", "Marks" : 98 } ] }참고: 최신 MongoDB 버전에서의 권장 사항
MongoDB 4.2 이상 버전에서는 기존의 update() 메서드 대신 updateOne() 또는 updateMany() 사용이 권장됩니다. 동일한 작업을 updateOne()으로 수행하려면 다음과 같이 작성할 수 있습니다.
> db.demo97.updateOne(
... { "Details.Name": "Bob" },
... { $inc: { "Details.$.Marks": 10 } }
... );
이처럼 $inc 연산자와 위치 연산자($)를 조합하면 별도의 데이터 조회 없이 배열 내 특정 요소의 값을 효율적으로 수정할 수 있습니다.