
- MongoDB 教程
- MongoDB - 首頁
- MongoDB - 概述
- MongoDB - 優勢
- MongoDB - 環境
- MongoDB - 資料建模
- MongoDB - 建立資料庫
- MongoDB - 刪除資料庫
- MongoDB - 建立集合
- MongoDB - 刪除集合
- MongoDB - 資料型別
- MongoDB - 插入文件
- MongoDB - 查詢文件
- MongoDB - 更新文件
- MongoDB - 刪除文件
- MongoDB - 投影
- MongoDB - 限制記錄
- MongoDB - 排序記錄
- MongoDB - 索引
- MongoDB - 聚合
- MongoDB - 複製
- MongoDB - 分片
- MongoDB - 建立備份
- MongoDB - 部署
- MongoDB - Java
- MongoDB - PHP
- 高階 MongoDB
- MongoDB - 關係
- MongoDB - 資料庫引用
- MongoDB - 覆蓋查詢
- MongoDB - 分析查詢
- MongoDB - 原子操作
- MongoDB - 高階索引
- MongoDB - 索引限制
- MongoDB - ObjectId
- MongoDB - Map Reduce
- MongoDB - 文字搜尋
- MongoDB - 正則表示式
- 使用 Rockmongo
- MongoDB - GridFS
- MongoDB - 有上限的集合
- 自動遞增序列
- MongoDB 有用資源
- MongoDB - 問答
- MongoDB - 快速指南
- MongoDB - 有用資源
- MongoDB - 討論
MongoDB - 原子操作
原子操作模型資料
維護原子性的推薦方法是,使用**嵌入文件**將所有經常一起更新的相關資訊儲存在單個文件中。這將確保單個文件的所有更新都是原子的。
假設我們已經建立了一個名為 productDetails 的集合,並在其中插入瞭如下所示的文件:
>db.createCollection("products") { "ok" : 1 } > db.productDetails.insert( { "_id":1, "product_name": "Samsung S3", "category": "mobiles", "product_total": 5, "product_available": 3, "product_bought_by": [ { "customer": "john", "date": "7-Jan-2014" }, { "customer": "mark", "date": "8-Jan-2014" } ] } ) WriteResult({ "nInserted" : 1 }) >
在此文件中,我們在 **product_bought_by** 欄位中嵌入了購買產品的客戶的資訊。現在,每當新客戶購買產品時,我們首先會使用 **product_available** 欄位檢查產品是否仍然可用。如果可用,我們將減少 product_available 欄位的值,並同時在 product_bought_by 欄位中插入新客戶的嵌入文件。我們將使用 **findAndModify** 命令來實現此功能,因為它可以同時搜尋和更新文件。
>db.products.findAndModify({ query:{_id:2,product_available:{$gt:0}}, update:{ $inc:{product_available:-1}, $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} } })
我們使用嵌入文件和 findAndModify 查詢的方法確保了只有在產品可用時才會更新產品購買資訊。並且由於整個事務都在同一個查詢中完成,因此它是原子的。
與此相反,考慮一下我們將產品可用性和購買產品者資訊分開儲存的情況。在這種情況下,我們將首先使用第一個查詢檢查產品是否可用。然後在第二個查詢中,我們將更新購買資訊。但是,這兩個查詢執行之間,其他使用者可能已經購買了產品,導致產品不再可用。在不知道這種情況的情況下,我們的第二個查詢將根據第一個查詢的結果更新購買資訊。這將導致資料庫不一致,因為我們出售了實際上不可用的產品。
廣告