MongoDB 원자적 작업
Mongodb는 트랜잭션을 지원하지 않으므로 프로젝트에 적용할 때 주의하시기 바랍니다. 디자인이 무엇이든 데이터 무결성을 보장하기 위해 mongodb가 필요하지 않습니다.
그러나 mongodb는 문서 저장, 수정, 삭제 등 원자적 작업인 많은 원자적 작업을 제공합니다.
소위 원자 연산이란 문서가 Mongodb에 저장되거나, 쿼리된 문서가 완전히 저장되지 않는 상황이 발생하지 않음을 의미합니다.
원자적 연산 데이터 모델
다음의 도서관 도서 및 대출 정보 예시를 살펴보세요.
이 예에서는 원자성 작업(업데이트: 업데이트)과 관련된 포함된 필드가 동일한 문서에서 동기화되도록 하는 방법을 보여줍니다.
book = { _id: 123456789, title: "MongoDB: The Definitive Guide", author: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", publisher_id: "oreilly", available: 3, checkout: [ { by: "joe", date: ISODate("2012-10-15") } ] }
db.collection.findAndModify() 메소드를 사용하여 도서 정산 가능 여부를 확인하고 새로운 정산 정보를 업데이트할 수 있습니다.
사용 가능한 필드와 체크아웃 필드를 동일한 문서에 삽입하여 해당 필드가 동기적으로 업데이트되도록 합니다.
db.books.findAndModify ( { query: { _id: 123456789, available: { $gt: 0 } }, update: { $inc: { available: -1 }, $push: { checkout: { by: "abc", date: new Date() } } } } )
원자성 작업을 위한 일반 명령
$set
은 키를 지정하고 키 값을 업데이트하는 데 사용됩니다. 키가 없으면 만듭니다.
{ $set : { field : value } }
$unset
은 키를 삭제하는 데 사용됩니다.
{ $unset : { field : 1} }
$inc
$inc는 값이 숫자인 문서의 키를 늘리거나 줄일 수 있습니다(요구 사항을 충족하는 숫자만 가능).
{ $inc : { field : value } }
$push
사용법:
{ $push : { field : value } }
필드에 값을 추가합니다. 필드가 없으면 새 배열이 추가됩니다. .
$pushAll
한 번에 여러 값을 배열 필드에 추가할 수 있다는 점을 제외하면 $push와 동일합니다.
{ $pushAll : { field : value_array } }
$pull
배열 필드에서 value와 동일한 값을 삭제합니다.
{ $pull : { field : _value } }
$addToSet
배열에 값을 추가하고, 값이 배열에 없는 경우에만 추가합니다.
$pop
배열의 첫 번째 또는 마지막 요소 삭제
{ $pop : { field : 1 } }
$rename
필드 이름 수정
{ $rename : { old_field_name : new_field_name } }
$ bit
비트 연산, 정수형
{$bit : { field : {and : 5}}}
오프셋 연산자
> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] } > t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true ) > t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }