MongoDB에서 배열(리스트) 안에 있는 특정 항목만 골라서 업데이트해야 하는 경우가 종종 있습니다. 이럴 때 위치 연산자($)를 사용하면 조건에 일치하는 배열 요소를 정확히 지정할 수 있고, 필드 값을 1씩 증가시키려면 $inc 연산자를 함께 사용하면 됩니다.
이 글에서는 실제 예제를 통해 배열 내 단일 항목의 가격 값을 1씩 증가시키는 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 제품 정보를 담은 컬렉션을 만들고 문서를 삽입합니다. 각 문서에는 ProductDetails라는 배열 필드가 포함되어 있습니다.
> db.demo39.insertOne({"ProductDetails":[{"ProductName":"Product-1","ProductPrice":349}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e176d54cfb11e5c34d898df")
}
> db.demo39.insertOne({"ProductDetails":[{"ProductName":"Product-2","ProductPrice":998}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e176d61cfb11e5c34d898e0")
}
> db.demo39.insertOne({"ProductDetails":[{"ProductName":"Product-3","ProductPrice":145}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e176d6acfb11e5c34d898e1")
}2단계: find()로 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo39.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e176d54cfb11e5c34d898df"), "ProductDetails" : [ { "ProductName" : "Product-1", "ProductPrice" : 349 } ] }
{ "_id" : ObjectId("5e176d61cfb11e5c34d898e0"), "ProductDetails" : [ { "ProductName" : "Product-2", "ProductPrice" : 998 } ] }
{ "_id" : ObjectId("5e176d6acfb11e5c34d898e1"), "ProductDetails" : [ { "ProductName" : "Product-3", "ProductPrice" : 145 } ] }3단계: 위치 연산자와 $inc로 항목 업데이트
이제 핵심 부분입니다. 아래 쿼리는 _id가 일치하는 문서 중에서 ProductName이 "Product-2"인 배열 요소를 찾아, 해당 요소의 ProductPrice 값을 1 증가시킵니다.
> db.demo39.update({"_id" : ObjectId("5e176d61cfb11e5c34d898e0"),'ProductDetails.ProductName':"Product-2"},{$inc: {'ProductDetails.$.ProductPrice': 1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 ProductDetails.$ 표기법이 바로 위치 연산자입니다. 쿼리 조건에서 매칭된 배열 요소의 위치를 자동으로 참조하므로, 인덱스 번호를 직접 지정하지 않아도 원하는 항목만 정확하게 수정할 수 있습니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인합니다.
> db.demo39.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e176d54cfb11e5c34d898df"), "ProductDetails" : [ { "ProductName" : "Product-1", "ProductPrice" : 349 } ] }
{ "_id" : ObjectId("5e176d61cfb11e5c34d898e0"), "ProductDetails" : [ { "ProductName" : "Product-2", "ProductPrice" : 999 } ] }
{ "_id" : ObjectId("5e176d6acfb11e5c34d898e1"), "ProductDetails" : [ { "ProductName" : "Product-3", "ProductPrice" : 145 } ] }정리
결과를 보면 Product-2의 ProductPrice가 998에서 999로 정확히 1 증가한 것을 확인할 수 있으며, 나머지 문서는 그대로 유지됩니다.
이처럼 MongoDB에서는 위치 연산자($)와 $inc 연산자를 조합하면 배열 내 특정 항목만 선택적으로 업데이트하면서 값을 손쉽게 증감시킬 수 있습니다. 배열 요소 중 조건에 맞는 하나만 수정해야 할 때 매우 유용한 패턴이므로 꼭 기억해 두시기 바랍니다.