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

MongoDB에서 문서의 단일 값만 증가시키는 방법 ($inc 연산자 활용)

MongoDB에서 특정 문서의 하나의 필드 값만 증가시키고 싶다면 $inc 연산자를 update() 메서드와 함께 사용하면 됩니다. $inc는 지정한 숫자만큼 필드 값을 원자적으로(atomic) 증가 또는 감소시켜 주기 때문에 조회수 카운트, 점수 누적 등에 매우 유용합니다.

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo698.insertOne({Score:78});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea6d8a4551299a9f98c9398")
}
> db.demo698.insertOne({Score:56});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea6d8a7551299a9f98c9399")
}
> db.demo698.insertOne({Score:65});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea6d8aa551299a9f98c939a")
}
> db.demo698.insertOne({Score:88});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea6d8b0551299a9f98c939b")
}

삽입된 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo698.find();

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

{ "_id" : ObjectId("5ea6d8a4551299a9f98c9398"), "Score" : 78 }
{ "_id" : ObjectId("5ea6d8a7551299a9f98c9399"), "Score" : 56 }
{ "_id" : ObjectId("5ea6d8aa551299a9f98c939a"), "Score" : 65 }
{ "_id" : ObjectId("5ea6d8b0551299a9f98c939b"), "Score" : 88 }

$inc로 단일 값 증가시키기

이제 특정 문서의 Score 필드 값만 12씩 증가시키는 쿼리입니다. 조건으로 해당 문서의 _id를 지정하고, 업데이트 부분에 $inc 연산자를 사용합니다.

> db.demo698.update({_id:ObjectId("5ea6d8b0551299a9f98c939b")},{$inc:{Score:12}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

결과를 보면 nMatched가 1, nModified가 1로 표시되는데, 이는 조건에 일치하는 문서 1개가 성공적으로 수정되었음을 의미합니다.

업데이트 후 결과 확인

다시 find() 메서드로 모든 문서를 조회해 보겠습니다.

> db.demo698.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5ea6d8a4551299a9f98c9398"), "Score" : 78 }
{ "_id" : ObjectId("5ea6d8a7551299a9f98c9399"), "Score" : 56 }
{ "_id" : ObjectId("5ea6d8aa551299a9f98c939a"), "Score" : 65 }
{ "_id" : ObjectId("5ea6d8b0551299a9f98c939b"), "Score" : 100 }

_id가 5ea6d8b0551299a9f98c939b인 문서의 Score 값이 88에서 100으로 정확히 12 증가한 것을 확인할 수 있으며, 나머지 문서들은 전혀 영향을 받지 않았습니다.

참고 사항

  • $inc 연산자는 숫자 타입 필드에만 사용할 수 있습니다. 문자열 필드에 적용하면 에러가 발생합니다.
  • 증가시키려는 값에 음수를 지정하면 값을 감소시킬 수도 있습니다. 예를 들어 {$inc:{Score:-12}}처럼 작성하면 됩니다.
  • 조건에 일치하는 필드가 없다면 새 필드가 생성되며 값이 초기화된 후 증가됩니다.
  • 여러 문서를 한 번에 업데이트하려면 updateMany()와 함께 multi 옵션을 활용할 수 있습니다.