MongoDB 업데이트 연산자

MongoDB 업데이트 연산자 (Update Operators)

기존 도큐먼트의 값을 바꿀 때, 필드를 통째로 새 값으로 덮어쓰는 대신 "값을 더한다", "배열에 항목을 붙인다" 같은 세밀한 조작을 하고 싶다면 업데이트 연산자를 써요. updateOne, updateMany 같은 갱신 메서드 안에서 필드 단위로 동작해요. 같은 필드라도 어떤 연산자를 쓰느냐에 따라 갱신 방식이 달라집니다.

출처: Update Operators - MongoDB 공식 매뉴얼

문법과 동작

업데이트 연산자는 갱신 문서 안에서 <연산자>: { <필드>: <값> } 형태로 써요. 예를 들어 점수 필드를 5만큼 올리고 싶으면 이렇게 표현해요.

db.students.updateOne(
   { _id: 1 },
   { $inc: { score: 5 } }
)

MongoDB 5.0부터 업데이트 연산자는 문자열 이름을 가진 필드를 **사전순(lexicographic)**으로 처리하고, 숫자 이름을 가진 필드는 숫자 순서대로 처리해요. 예를 들어 이런 $set이 있다면

{ $set : { "a.2" : <new value>, "a.10": <new value> } }

MongoDB 5.0 이상에서는 숫자 순서가 210보다 앞이기 때문에 "a.2"를 먼저 처리해요. 처리 순서가 결과에 영향을 줄 수 있으니 이 규칙을 기억해 두면 좋아요.

필드용 업데이트 연산자

하나의 필드 값을 다루는 연산자들이에요.

  • $currentDate — 필드 값을 지금 날짜(Date 또는 Timestamp)로 설정해요.
  • $inc — 필드 값을 지정한 만큼 증가시켜요.
  • $max — 지정한 값이 기존 필드 값보다 크면 그때만 필드를 갱신해요.
  • $mul — 필드 값을 지정한 수만큼 곱해요.
  • $rename — 필드 이름을 바꿔요.
  • $set — 도큐먼트의 필드 값을 설정해요.
  • $setOnInsert — 갱신 결과 도큐먼트가 삽입될 때만 필드 값을 설정해요. 기존 도큐먼트를 수정하는 갱신에는 아무 영향이 없어요.
  • $unset — 도큐먼트에서 지정한 필드를 제거해요.

배열용 업데이트 연산자

배열 안의 항목을 다루는 연산자도 따로 있어요.

  • $addToSet — 배열에 아직 없는 요소만 추가해요. 중복을 허용하지 않아요.
  • $pop — 배열의 첫 번째 또는 마지막 항목을 제거해요.
  • $push — 배열에 항목을 추가해요.
  • $pull — 지정한 조건과 일치하는 모든 배열 요소를 제거해요.
  • $pullAll — 배열에서 일치하는 모든 값을 제거해요.
  • $each$push$addToSet 연산자를 확장해서 여러 항목을 한 번에 추가하게 해줘요.
  • $position$push 연산자가 배열의 어느 위치에 요소를 추가할지 지정해요.
  • $sort$push 연산자와 함께 써서 배열에 저장된 도큐먼트를 재정렬해요.

업데이트 안에 집계 파이프라인 쓰기

단순히 상수를 넣는 대신, 다른 필드의 값을 참고하거나 현재 값을 조건에 따라 바꾸는 표현적인 갱신이 필요하다면 집계 파이프라인으로 업데이트할 수도 있어요. 이 경우 Update with Aggregation Pipeline 문법을 따르며, 별도 문서에서 자세한 구문과 예제를 확인할 수 있어요.

더 알아보기