티스토리 뷰
개인 공부를 위하여 몽고디비 공식문서를 한글로 번역한 글입니다.
이 페이지는 다음 몽고 셸 메서드들을 사용한다.
- db.collection.updateOne( <filter>, <update>, <options> )
- db.collection.updateMany( <filter>, <update>, <options> )
- db.collection.replaceOne( <filter>, <update>, <options> )
이 페이지의 예시들은 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를 포함하고, 지정된 필터에 일치하는 도큐먼트가 없다면, 해당 연산은 새 도큐먼트를 생성하고 삽입할 것이다. 일치하는 도큐먼트가 있다면, 해당 연산은 일치하는 도큐먼트를 수정하거나 교체한다.
'dev > mongodb' 카테고리의 다른 글
[번역] MongoDB Aggregation / 어그리게이션, 집합, 집계 (0) | 2019.10.03 |
---|---|
[번역] MongoDB Delete Documents / 도큐먼트 삭제 (0) | 2019.09.14 |
[번역] MongoDB Query Documents / 도큐먼트 쿼리 (0) | 2019.09.14 |
MongoDB / NoSQL 이란? (0) | 2019.09.12 |
[번역] MongoDB Insert Documents / 도큐먼트 삽입 (0) | 2019.09.11 |