티스토리 뷰

개인 공부를 위하여 몽고디비 공식문서를 한글로 번역한 글입니다.

이 페이지는 다음 몽고 셸 메서드들을 사용한다.

이 페이지의 예시들은 inventory 컬렉션을 사용한다. inventory 컬렉션을 생성하기 위하여, 다음을 실행하자:

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

실행 결과:

{
	"acknowledged": true,
	"insertedIds": [
		ObjectId("5d7c8a2aa19e8beda779498f"),
		ObjectId("5d7c8a2aa19e8beda7794990"),
		ObjectId("5d7c8a2aa19e8beda7794991"),
		ObjectId("5d7c8a2aa19e8beda7794992"),
		ObjectId("5d7c8a2aa19e8beda7794993"),
		ObjectId("5d7c8a2aa19e8beda7794994"),
		ObjectId("5d7c8a2aa19e8beda7794995"),
		ObjectId("5d7c8a2aa19e8beda7794996"),
		ObjectId("5d7c8a2aa19e8beda7794997"),
		ObjectId("5d7c8a2aa19e8beda7794998")
 	]
}

> 컬렉션의 도큐먼트 업데이트

도큐먼트를 업데이트하기 위하여, 몽고디비는 $set과 같은 필드 값을 수정하기 위한 업데이트 연산자를 제공한다. 

업데이트 연산자를 사용하기 위하여, 다음 형식의 업데이트 도큐먼트를 업데이트 메서드에 전달하자:

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

$set과 같은 일부 업데이트 연산자들은 필드가 존재하지 않는 경우 그 필드를 생성한다. 상세내용은 개별 업데이트 연산자 참조를 확인하자.

>> 업데이트 연산자

  • 필드
이름 설명
$currentDate 필드 값을 날짜 또는 타임스탬프 형식으로, 현재 날짜로 설정한다.
$inc 필드 값을 지정된 양만큼 증가시킨다.
$min 지정된 값이 기존 필드 값보다 작은 경우에만 필드를 업데이트한다.
$max 지정된 값이 기존 필드 값보다 큰 경우에만 필드를 업데이트한다.
$mul 필드 값을 지정된 양만큼 곱한다.
$rename 필드명을 수정한다.
$set 도큐먼트의 필드 값을 설정한다.
$setOnInsert 업데이트로 도큐먼트가 삽입되는 경우 필드 값을 설정한다. 기존 도큐먼트를 수정하는 경우에는 영향을 미치지 않는다.
$unset 도큐먼트에서 지정된 필드를 제거한다.

 

  • 배열- 연산자
이름 설명
$ 쿼리 조건과 일치하는 첫 번째 요소를 업데이트하라는 자리 표시자 역할을 한다.
$[] 쿼리 조건과 일치하는 도큐먼트에 대해 배열의 모든 요소를 업데이트하라는 자리 표시자 역할을 한다.
$[<identifier>] 쿼리 조건과 일치하는 도큐먼트에 대해 arrayFilters 조건과 일치하는 모든 요소를 업데이트하는 자리 표시자 역할을 한다.
$addToSet Set에 이미 존재하지 않는 경우에만 배열에 요소를 추가한다.
$pop 배열의 첫 번째 또는 마지막 항목을 제거한다.
$pull 지정된 쿼리와 일치하는 모든 배열의 요소를 제거한다.
$push 배열에 항목을 추가한다.
$pullAll 배열에서 일치하는 모든 값을 제거한다.

 

  • 배열- 한정어
이름 설명
$each $push 및 $addToSet 연산자가 배열 업데이트를 위해 여러 항목을 추가할 수 있도록 한정한다.
$position $push 연산자가 배열에 요소를 추가하기 위해 배열 안의 위치를 지정할 수 있도록 한정한다.
$slice $push 연산자가 업데이트된 배열의 크기를 제한하도록 한정한다.
$sort $push 연산자가 배열에 저장된 도큐먼트의 순서를 변경하도록 한정한다.

> 단일 도큐먼트 업데이트

다음 예시는 inventory 컬렉션에 item이 "paper"인 첫 번째 도큐먼트를 업데이트하기 위하여 db.collection.updateOne() 메서드를 사용한다:

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

이 업데이트 연산은:

  • size.uom 필드 값을 "cm"으로, status 필드 값을 "P"로 업데이트하기 위하여 $set 연산자를 사용한다.
  • lastModified 필드 값을 현재 date로 업데이트하기 위하여 $currentDate 연산자를 사용한다. lastModified 필드가 존재하지 않는다면, $currentDate는 필드를 생성할 것이다.

> 다중 도큐먼트 업데이트

다음 예시는 inventory 컬렉션에 qty가 50 미만인 모든 도큐먼트를 업데이트하기 위하여 db.collection.updateMany() 메서드를 사용한다:

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

이 업데이트 연산은:

  • size.uom 필드 값을 "in"으로, status 필드 값을 "P"로 업데이트하기 위하여 $set 연산자를 사용한다.
  • lastModified 필드 값을 현재 date로 업데이트하기 위하여 $currentDate 연산자를 사용한다. lastModified 필드가 존재하지 않는다면, $currentDate는 필드를 생성할 것이다.

> 도큐먼트 교체

_id 필드를 제외한 도큐먼트의 전체 내용을 교체하기 위하여, db.collection.replaceOne()의 두 번째 argument로서 완전히 새로운 도큐먼트를 전달하자.

도큐먼트를 교체할 때, 교체 도큐먼트는 오직 field/value 쌍들만으로 구성되어야 한다. 업데이트 연산자 표현을 포함할 수 없다.

교체 도큐먼트는 기존 도큐먼트와 다른 필드를 가질 수 있다. 교체 도큐먼트에서는 _id 필드가 불변하므로 _id 필드를 생략할 수 있지만, _id 필드를 포함하면 현재 값과 동일한 값을 가져야 한다.

다음 예시는 inventory 컬렉션의 item이 "paper"인 첫 번째 도큐먼트를 교체한다:

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

> 업데이트 동작

  • 원자성
    • 몽고디비에서 모든 쓰기 연산들은 단일 도큐먼트 레벨에서 원자적이다.
  • _id 필드
    • 일단 설정되면, _id 필드 값을 업데이트할 수 없고, 기존 도큐먼트를 _id 필드 값이 다른 교체 도큐먼트로 교체할 수도 없다.
  • 필드 순서
    • 몽고디비는 다음과 같은 경우를 제외하고 쓰기 작업 후 도큐먼트 필드의 순서를 보존한다:
      • _id 필드는 항상 도큐먼트의 첫 번째 필드이다.
      • 필드명 renaming을 포함하는 업데이트는 도큐먼트의 필드 순서를 재조정할 수 있다.
  • Upsert 옵션
    • 만약 updateOne(), updateMany(), replaceOne()이 upsert: true를 포함하고, 지정된 필터에 일치하는 도큐먼트가 없다면, 해당 연산은 새 도큐먼트를 생성하고 삽입할 것이다. 일치하는 도큐먼트가 있다면, 해당 연산은 일치하는 도큐먼트를 수정하거나 교체한다.
728x90
댓글