원자 조작용 모델 데이터
이 페이지의 내용
MongoDB 는 복제본 세트 및 샤딩된 클러스터에 대해 다중 문서 트랜잭션 을 지원하지만, 대부분의 시나리오에서 이 페이지에서 설명한 비정규화 데이터 모델 은 계속해서 데이터 및 사용 사례에 최적일 것입니다.
패턴
MongoDB에서 단일 문서에 대한 쓰기는 원자성 연산입니다. 함께 업데이트해야 하는 필드의 경우 동일한 문서 내에 필드를 포함하면 필드를 원자성으로 업데이트할 수 있습니다.
예를 들어, 현재 결제 정보뿐만 아니라 결제 가능한 부수를 포함하여 책에 대한 정보를 유지해야 하는 상황을 생각해 보세요.
결제 가능한 부수와 결제 정보가 동기화되어야 합니다. 따라서 동일한 문서 내에 available
필드와 checkout
필드를 삽입하면 두 필드를 원자적으로 업데이트할 수 있습니다.
{ _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.updateOne()
메서드를 사용하여 available
필드와 checkout
필드를 모두 다음과 같이 원자적으로 업데이트할 수 있습니다.
db.books.updateOne ( { _id: 123456789, available: { $gt: 0 } }, { $inc: { available: -1 }, $push: { checkout: { by: "abc", date: new Date() } } } )
이 작업은 다음과 같이 작업 상태에 대한 정보가 포함된 문서를 반환합니다.
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
matchedCount
필드는 1
문서가 업데이트 조건과 일치했음을 보여주고, modifiedCount
는 연산이 1
문서를 업데이트했음을 보여줍니다.
업데이트 조건과 일치하는 문서가 없으면 matchedCount
및 modifiedCount
0
가 되며 책을 결제할 수 없음을 나타냅니다.