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

MongoDB에서 $inc 연산자에 한도 설정하는 방법 – $lt 조건 활용하기

MongoDB에서 $inc 연산자에 한도 설정하는 방법

MongoDB의 $inc 연산자에는 최댓값을 제한하는 기능이 기본적으로 내장되어 있지 않습니다. 따라서 특정 값을 초과하지 않도록 필드를 증가시키려면, 업데이트 쿼리의 조건 부분에 비교 연산자 $lt(미만)를 함께 사용해야 합니다. 이렇게 하면 조건을 만족하는 문서에만 증가 연산이 적용되어 사실상의 '한도'가 설정됩니다.

기본 문법

$inc에 한도를 설정하려면 아래와 같은 구문을 사용합니다.

db.yourCollectionName.update({yourFieldName : {$lt : yourValue}}, {$inc : {yourFieldName : yourIncrementValue}},false,true);

여기서 세 번째 인자 falseupsert 옵션으로, 조건에 맞는 문서가 없어도 새 문서를 생성하지 않겠다는 의미입니다. 네 번째 인자 truemulti 옵션으로, 조건에 일치하는 모든 문서를 한 번에 업데이트하겠다는 뜻입니다.

예제용 컬렉션 생성하기

먼저 문서를 포함하는 컬렉션을 생성해 보겠습니다.

> db.limitIncrementDemo.insertOne({"StudentId":101,"StudentScore":95});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2ce9eb64f4b851c3a13c3")
}
> db.limitIncrementDemo.insertOne({"StudentId":102,"StudentScore":55});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2cea0b64f4b851c3a13c4")
}
> db.limitIncrementDemo.insertOne({"StudentId":103,"StudentScore":67});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2cea1b64f4b851c3a13c5")
}
> db.limitIncrementDemo.insertOne({"StudentId":104,"StudentScore":56});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2cea3b64f4b851c3a13c6")
}
> db.limitIncrementDemo.insertOne({"StudentId":105,"StudentScore":79});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2cea4b64f4b851c3a13c7")
}

저장된 문서 확인하기

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

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

위 쿼리는 다음과 같은 출력을 반환합니다.

{
   "_id" : ObjectId("5cd2ce9eb64f4b851c3a13c3"),
   "StudentId" : 101,
   "StudentScore" : 95
}
{
   "_id" : ObjectId("5cd2cea0b64f4b851c3a13c4"),
   "StudentId" : 102,
   "StudentScore" : 55
}
{
   "_id" : ObjectId("5cd2cea1b64f4b851c3a13c5"),
   "StudentId" : 103,
   "StudentScore" : 67
}
{
   "_id" : ObjectId("5cd2cea3b64f4b851c3a13c6"),
   "StudentId" : 104,
   "StudentScore" : 56
}
{
   "_id" : ObjectId("5cd2cea4b64f4b851c3a13c7"),
   "StudentId" : 105,
   "StudentScore" : 79
}

$inc에 한도 적용하기

이제 StudentScore가 75 미만인 문서에 대해서만 점수를 10씩 증가시켜 보겠습니다.

> db.limitIncrementDemo.update({StudentScore : {$lt : 75}}, {$inc : {StudentScore : 10}},false,true);
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

실행 결과를 보면 조건에 일치한 3개의 문서가 성공적으로 수정되었음을 알 수 있습니다.

업데이트 결과 확인

변경이 정상적으로 적용되었는지 다시 전체 문서를 조회해 보겠습니다.

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

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

{
   "_id" : ObjectId("5cd2ce9eb64f4b851c3a13c3"),
   "StudentId" : 101,
   "StudentScore" : 95
}
{
   "_id" : ObjectId("5cd2cea0b64f4b851c3a13c4"),
   "StudentId" : 102,
   "StudentScore" : 65
}
{
   "_id" : ObjectId("5cd2cea1b64f4b851c3a13c5"),
   "StudentId" : 103,
   "StudentScore" : 77
}
{
   "_id" : ObjectId("5cd2cea3b64f4b851c3a13c6"),
   "StudentId" : 104,
   "StudentScore" : 66
}
{
   "_id" : ObjectId("5cd2cea4b64f4b851c3a13c7"),
   "StudentId" : 105,
   "StudentScore" : 79
}

결과 분석 및 정리

StudentId 102, 103, 104의 문서는 원래 점수가 75 미만이었기 때문에 각각 10점씩 증가하여 65, 77, 66으로 변경되었습니다. 반면 StudentId 101(95점)과 105(79점)는 이미 75 이상이므로 조건에 해당하지 않아 그대로 유지되었습니다.

이처럼 $lt 같은 비교 연산자를 업데이트 조건으로 활용하면 $inc 연산에 효과적으로 한도를 걸 수 있습니다. 참고로 최신 MongoDB 버전에서는 update() 대신 updateMany() 메서드를 사용하는 것이 권장되며, 동작 방식은 동일합니다.