アトミック操作のモデルデータ
項目一覧
MongoDB はレプリカセットとシャーディングされたクラスターを対象にマルチドキュメントトランザクションをサポートしていますが、多くのシナリオにおいて、このページで説明する非正規化データモデルは引き続きデータやユースケースに最適です。
パターン
MongoDB では、1 つのドキュメントに対する書込み (write) 操作は不可分です。 一緒に更新する必要があるフィールドの場合、同じドキュメント内にフィールドを埋め込むことで、フィールドを不可分的に更新できるようになります。
たとえば、チェックアウト可能なコピーの数や現在のチェックアウト情報など、書籍に関する情報を保持する必要がある状況を考えてみましょう。
書籍の利用可能なコピーとチェックアウト情報は同期されている必要があります。 そのため、同じドキュメント内に available
フィールドとcheckout
フィールドを埋め込むと、2 つのフィールドを不可分的に更新できるようになります。
{ _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
になり、書籍をチェックアウトできないことを示します。