MongoDB에서 특정 문서의 숫자 필드 값을 감소시켜야 할 때가 종종 있습니다. 예를 들어 상품 가격을 인하하거나 재고 수량을 줄이는 경우가 대표적입니다. 이럴 때 $inc 연산자에 음수 값을 사용하면 원하는 필드의 값만 간단하게 감소시킬 수 있습니다.
이 글에서는 실제 예제를 통해 MongoDB에서 단일 값을 감소시키는 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.decrementingOperationDemo.insertOne({"ProductName":"Product-1","ProductPrice":756});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7a8ae6d78f205348bc63c")
}
> db.decrementingOperationDemo.insertOne({"ProductName":"Product-2","ProductPrice":890});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7a8b86d78f205348bc63d")
}
> db.decrementingOperationDemo.insertOne({"ProductName":"Product-3","ProductPrice":994});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7a8c66d78f205348bc63e")
}
> db.decrementingOperationDemo.insertOne({"ProductName":"Product-4","ProductPrice":1000});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7a8d06d78f205348bc63f")
}위 쿼리는 decrementingOperationDemo라는 컬렉션에 상품 이름(ProductName)과 상품 가격(ProductPrice)을 담은 4개의 문서를 삽입합니다.
2. 저장된 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.decrementingOperationDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd7a8ae6d78f205348bc63c"),
"ProductName" : "Product-1",
"ProductPrice" : 756
}
{
"_id" : ObjectId("5cd7a8b86d78f205348bc63d"),
"ProductName" : "Product-2",
"ProductPrice" : 890
}
{
"_id" : ObjectId("5cd7a8c66d78f205348bc63e"),
"ProductName" : "Product-3",
"ProductPrice" : 994
}
{
"_id" : ObjectId("5cd7a8d06d78f205348bc63f"),
"ProductName" : "Product-4",
"ProductPrice" : 1000
}3. $inc 연산자로 단일 값 감소시키기
이제 핵심 단계입니다. update() 메서드와 함께 $inc 연산자를 사용하여 특정 문서의 값을 감소시킵니다. 여기서는 Product-4의 가격을 10만큼 낮춰보겠습니다.
> db.decrementingOperationDemo.update({_id: ObjectId("5cd7a8d06d78f205348bc63f"), ProductPrice: {$gt: 0}}, {$inc: {ProductPrice: -10}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리를 자세히 살펴보면 두 가지 중요한 포인트가 있습니다.
- 조건부 업데이트:
ProductPrice: {$gt: 0}조건을 추가하여 가격이 0보다 큰 경우에만 업데이트가 실행되도록 했습니다. 이렇게 하면 음수 가격이 되는 것을 방지할 수 있습니다. - $inc 연산자:
{$inc: {ProductPrice: -10}}처럼 음수 값을 지정하면 해당 필드가 지정한 만큼 감소합니다. 반대로 양수를 넣으면 값이 증가합니다.
실행 결과 nModified: 1이 반환된 것으로 보아 정확히 한 개의 문서가 성공적으로 수정되었음을 알 수 있습니다.
4. 업데이트 결과 확인하기
다시 한번 find() 메서드로 문서를 조회하여 변경 사항을 확인해 보겠습니다.
> db.decrementingOperationDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd7a8ae6d78f205348bc63c"),
"ProductName" : "Product-1",
"ProductPrice" : 756
}
{
"_id" : ObjectId("5cd7a8b86d78f205348bc63d"),
"ProductName" : "Product-2",
"ProductPrice" : 890
}
{
"_id" : ObjectId("5cd7a8c66d78f205348bc63e"),
"ProductName" : "Product-3",
"ProductPrice" : 994
}
{
"_id" : ObjectId("5cd7a8d06d78f205348bc63f"),
"ProductName" : "Product-4",
"ProductPrice" : 990
}Product-4의 가격이 기존의 1000에서 990으로 정확히 10 감소한 것을 확인할 수 있으며, 나머지 문서들은 그대로 유지됩니다.
마무리
MongoDB에서 단일 값을 감소시키는 것은 매우 간단합니다. 핵심은 $inc 연산자에 음수 값을 전달하는 것입니다. 또한 업데이트 조건에 $gt 같은 비교 연산자를 함께 사용하면 값이 음수가 되는 상황을 미리 방지할 수 있어 더욱 안전한 데이터 처리가 가능합니다. 참고로 최신 MongoDB 버전에서는 update() 대신 updateOne()이나 updateMany() 메서드 사용을 권장하고 있습니다.