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

MongoDB에서 투표(Vote) 레코드의 단일 항목만 업데이트하는 쿼리 작성법

MongoDB에서 여러 문서 중 특정 조건에 일치하는 하나의 문서 내 단일 필드만 업데이트해야 하는 경우가 자주 있습니다. 예를 들어, 투표(Vote) 정보를 담은 문서에서 특정 투표자의 TotalVote 값만 증가시키고 싶다면 어떻게 해야 할까요? 이 글에서는 $inc 연산자와 점 표기법(Dot Notation)을 활용해 이를 해결하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 투표 데이터를 포함한 문서로 컬렉션을 생성합니다. insertOne() 메서드를 사용하여 두 개의 문서를 삽입해 보겠습니다.

> db.demo57.insertOne({"Votes":{"VoterName":"Chris","TotalVote":50}});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e285bb8cfb11e5c34d8991a")
}
> db.demo57.insertOne({"Votes":{"VoterName":"David","TotalVote":101}});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e285bc3cfb11e5c34d8991b")
}

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo57.find();

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

{ "_id" : ObjectId("5e285bb8cfb11e5c34d8991a"), "Votes" : { "VoterName" : "Chris", "TotalVote" : 50 } }
{ "_id" : ObjectId("5e285bc3cfb11e5c34d8991b"), "Votes" : { "VoterName" : "David", "TotalVote" : 101 } }

현재 Chris는 50표, David는 101표를 가지고 있습니다.

3. 단일 항목만 업데이트하는 쿼리 실행하기

이제 핵심 부분입니다. David의 TotalVote 값만 19 증가시키려면, 조건으로 Votes.VoterName이 "David"인 문서를 찾고, $inc 연산자로 Votes.TotalVote 필드만 수정하면 됩니다.

> db.demo57.update({"Votes.VoterName":"David" },{ $inc : { "Votes.TotalVote" : 19 } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과인 WriteResult를 보면 nMatched: 1, nModified: 1로 표시되어, 정확히 하나의 문서에서 하나의 필드만 성공적으로 변경되었음을 확인할 수 있습니다.

4. 업데이트 결과 검증하기

다시 find() 메서드로 전체 문서를 조회하여 변경 사항을 확인해 보겠습니다.

> db.demo57.find();

출력 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e285bb8cfb11e5c34d8991a"), "Votes" : { "VoterName" : "Chris", "TotalVote" : 50 } }
{ "_id" : ObjectId("5e285bc3cfb11e5c34d8991b"), "Votes" : { "VoterName" : "David", "TotalVote" : 120 } }

David의 TotalVote가 기존 101에서 120(101 + 19)으로 정확히 증가했으며, Chris의 데이터는 그대로 유지된 것을 볼 수 있습니다.

핵심 포인트 정리

  • 점 표기법(Dot Notation): "Votes.VoterName"처럼 중첩된 필드에 접근할 때는 점(.)을 사용합니다.
  • $inc 연산자: 필드 값을 지정한 만큼 증가(양수) 또는 감소(음수)시킵니다. 해당 필드가 없으면 새로 생성됩니다.
  • update() 동작 방식: 조건에 일치하는 첫 번째 문서만 업데이트합니다. 여러 문서를 한 번에 수정하려면 { multi: true } 옵션을 추가하거나, 최신 버전에서는 updateMany()를 사용하는 것이 좋습니다.

이처럼 MongoDB에서는 조건 쿼리와 업데이트 연산자를 조합하여 원하는 문서의 특정 필드만 안전하고 효율적으로 수정할 수 있습니다.