mongo shell을 사용하여 MongoDB 문서 데이터 업데이트하기

이 장에서는 mongo shell을 통해 MongoDB 문서 데이터를 업데이트하는 방법을 소개합니다. MongoDB는 다양한 유형의 연산자로 구현된 다양한 업데이트 방법을 지원하며 여러 업데이트 함수를 지원합니다.

테스트 데이터 준비

인벤토리 컬렉션에 테스트 데이터를 삽입합니다.

db.inventory.insertMany( [
   { item: "캔버스", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "저널", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "매트", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "마우스패드", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "노트북", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "용지", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "플래너", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "엽서", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "스케치북", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "스케치패드", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

업데이트 연산자 구문

문서를 업데이트하기 위해 MongoDB는 필드 값을 수정하는 여러 업데이트 연산자(e.g., $set)를 제공하고 있습니다.

업데이트 연산자 매개변수의 형식은 다음과 같습니다:

{
  <update operator>: { <field1>: <value1>, ... },
  <update operator>: { <field2>: <value2>, ... },
  ...
}

해석:

  • : 업데이트 연산자
  • : 필드 이름
  • : 필드 매개변수

$set 연산자

만일 필드가 존재하지 않으면 문서를 업데이트하고 새로운 필드를 생성합니다.

단일 문서 업데이트

db.collection.updateOne() 메서드를 사용하여 문서를 업데이트합니다.

db.inventory.updateOne(
   { item: "용지" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

업데이트 설명:

  • 먼저, 쿼리 조건을 사용하여 첫 번째 문서(item = 용지)를 검색합니다.
  • $set 연산자를 사용하여 size.uom 필드의 값을 cm으로, status 필드의 값을 P로 업데이트합니다.
  • $currentDate 연산자를 사용하여 lastModified 필드의 값을 현재 날짜로 업데이트합니다. 만일 lastModified 필드가 존재하지 않는다면, $currentDate는 해당 필드를 생성합니다.

다중 문서 업데이트

조건을 충족하는 여러 문서를 업데이트하기 위해 db.collection.updateMany() 메서드를 사용합니다.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

업데이트 설명:

  • 먼저, 쿼리 조건을 사용하여 모든 문서(qty < 50)를 검색합니다.
  • $set 연산자를 사용하여 size.uom 필드의 값을 in으로, status 필드의 값을 P로 업데이트합니다.
  • $currentDate 연산자를 사용하여 lastModified 필드의 값을 현재 날짜로 업데이트합니다. 만일 lastModified 필드가 존재하지 않는다면, $currentDate는 해당 필드를 생성합니다.

팁: $lt 연산자는 "미만"의 의미를 나타냅니다.

문서 교체

db.collection.replaceOne() 메서드를 사용하여 문서의 내용을 교체합니다 (_id 필드 제외). 교체할 문서는 원본 문서와 다른 필드를 가질 수 있습니다. _id 필드는 변경할 수 없으므로, 이를 생략할 수 있습니다. 그러나, _id 필드를 포함하는 경우 문서의 id 값은 일치해야 합니다.

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

해설:

  • 먼저 쿼리 조건 (item=paper)을 사용하여 첫 번째 문서를 검색합니다.
  • replaceOne 메서드의 두 번째 매개변수의 내용으로 일치하는 문서를 교체합니다.

업데이트 동작

원자성

MongoDB의 모든 쓰기 작업은 개별 문서 수준에서 원자적입니다.

_id 필드

_id 필드는 변경할 수 없으며 업데이트할 수 없습니다.