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

MongoDB에서 $max 연산자로 조건부 업서트(Upsert) 및 업데이트 수행하는 방법

MongoDB에서 조건부 업서트(Upsert) 및 업데이트 수행하기

MongoDB에서 조건에 따라 문서를 업데이트하거나 업서트(upsert)해야 할 때 $max 연산자를 활용할 수 있습니다. $max는 지정한 값이 현재 필드 값보다 클 경우에만 해당 필드를 갱신하는 연산자로, '최고 점수', '최대값 유지' 같은 시나리오에서 매우 유용합니다.

이 글에서는 실제 예제를 통해 $max 연산자를 사용한 조건부 업데이트 과정을 단계별로 살펴보겠습니다.

1단계: 샘플 컬렉션 생성

먼저 테스트에 사용할 문서들을 포함한 컬렉션을 생성합니다.

> db.conditionalUpdatesDemo.insertOne({"_id":100,"StudentFirstScore":89,"StudentSecondScore":78,"BiggestScore":89});
{ "acknowledged" : true, "insertedId" : 100 }
> db.conditionalUpdatesDemo.insertOne({"_id":101,"StudentFirstScore":305,"StudentSecondScore":560,"BiggestScore":1050});
{ "acknowledged" : true, "insertedId" : 101 }
> db.conditionalUpdatesDemo.insertOne({"_id":103,"StudentFirstScore":560,"StudentSecondScore":789,"BiggestScore":880});
{ "acknowledged" : true, "insertedId" : 103 }

2단계: 저장된 문서 확인

find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.

> db.conditionalUpdatesDemo.find().pretty();

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

{
   "_id" : 100,
   "StudentFirstScore" : 89,
   "StudentSecondScore" : 78,
   "BiggestScore" : 89
}
{
   "_id" : 101,
   "StudentFirstScore" : 305,
   "StudentSecondScore" : 560,
   "BiggestScore" : 1050
}
{
   "_id" : 103,
   "StudentFirstScore" : 560,
   "StudentSecondScore" : 789,
   "BiggestScore" : 880
}

3단계: $max 연산자로 조건부 업데이트 실행

이제 _id가 100인 문서의 "BiggestScore" 필드를 150으로 조건부 업데이트해 보겠습니다.

> db.conditionalUpdatesDemo.update( { _id: 100 }, { $max: { "BiggestScore": 150 } } );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과를 보면 nMatched가 1, nModified가 1로 표시되어, 조건에 일치한 문서 하나가 성공적으로 수정되었음을 알 수 있습니다.

4단계: 업데이트 결과 검증

_id 100 문서의 "BiggestScore" 필드가 실제로 150으로 변경되었는지 다시 조회하여 확인해 보겠습니다.

> db.conditionalUpdatesDemo.find().pretty();

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

{
   "_id" : 100,
   "StudentFirstScore" : 89,
   "StudentSecondScore" : 78,
   "BiggestScore" : 150
}
{
   "_id" : 101,
   "StudentFirstScore" : 305,
   "StudentSecondScore" : 560,
   "BiggestScore" : 1050
}
{
   "_id" : 103,
   "StudentFirstScore" : 560,
   "StudentSecondScore" : 789,
   "BiggestScore" : 880
}

$max 연산자의 동작 원리 정리

$max 연산자는 다음과 같은 규칙으로 동작합니다.

1. 새 값이 기존 값보다 큰 경우: 필드 값이 지정한 값으로 업데이트됩니다. 위 예제에서 기존 BiggestScore(89)보다 150이 크기 때문에 150으로 변경되었습니다.

2. 새 값이 기존 값보다 작거나 같은 경우: 아무 변화 없이 기존 값이 그대로 유지됩니다. 예를 들어 _id 101 문서에 $max로 500을 지정하면, 기존 값 1050이 더 크므로 업데이트되지 않습니다.

3. 필드가 존재하지 않는 경우: 해당 필드가 문서에 없다면 지정한 값으로 새 필드가 추가됩니다.

이러한 특성 덕분에 $max는 별도의 조회 로직 없이 한 번의 업데이트 연산만으로 '더 큰 값일 때만 갱신'하는 조건부 로직을 안전하게 구현할 수 있으며, 동시성 문제도 자연스럽게 방지할 수 있다는 장점이 있습니다.