MongoDB에서 문서의 숫자 값을 동적으로 증가시켜야 할 때가 있습니다. 이때 사용자 정의 변수(custom variable)를 선언하고 update() 메서드와 함께 $inc 연산자를 사용하면 원하는 만큼 값을 손쉽게 증가시킬 수 있습니다.
1. 테스트용 컬렉션 생성
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo271.insertOne({"Marks":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4821211627c0c63e7dbabc")
}
> db.demo271.insertOne({"Marks":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4821241627c0c63e7dbabd")
}
> db.demo271.insertOne({"Marks":72});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48212b1627c0c63e7dbabe")
}2. 현재 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo271.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e4821211627c0c63e7dbabc"), "Marks" : 56 }
{ "_id" : ObjectId("5e4821241627c0c63e7dbabd"), "Marks" : 78 }
{ "_id" : ObjectId("5e48212b1627c0c63e7dbabe"), "Marks" : 72 }3. 사용자 정의 변수와 $inc로 값 증가시키기
이제 변수 incrementValue에 증가시킬 값인 10을 할당한 뒤, update() 메서드와 $inc 연산자를 조합하여 Marks 값이 78인 문서만 선택적으로 증가시켜 보겠습니다.
> var incrementValue=10;
> db.demo271.update(
... { Marks: 78 },
... { $inc: { Marks:incrementValue } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과 nModified : 1이 반환된 것을 보면, 조건에 일치한 1개의 문서가 성공적으로 수정되었음을 알 수 있습니다.
참고: MongoDB 4.2 이상 버전에서는
updateOne(), updateMany() 같은 최신 업데이트 메서드 사용이 권장됩니다. 예를 들어 db.demo271.updateOne({ Marks: 78 }, { $inc: { Marks: incrementValue } })처럼 작성하면 됩니다.4. 업데이트 후 결과 확인
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo271.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e4821211627c0c63e7dbabc"), "Marks" : 56 }
{ "_id" : ObjectId("5e4821241627c0c63e7dbabd"), "Marks" : 88 }
{ "_id" : ObjectId("5e48212b1627c0c63e7dbabe"), "Marks" : 72 }결과 분석
출력 결과를 보면 Marks 값이 78이었던 두 번째 문서만 88로 10 증가한 것을 확인할 수 있습니다. 나머지 문서(56, 72)는 조건에 해당하지 않아 그대로 유지되었습니다.
이처럼 사용자 정의 변수를 활용하면 증가 폭을 코드 내에서 유연하게 변경할 수 있어, 점수 누적, 조회수 카운트, 재고 수량 조정 등 다양한 실무 시나리오에서 유용하게 활용할 수 있습니다.