- 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 查詢的方法確保了只有在產品可用時才會更新產品購買資訊。並且由於整個事務都在同一個查詢中完成,因此它是原子的。
與此相反,考慮一下我們將產品可用性和購買產品者資訊分開儲存的情況。在這種情況下,我們將首先使用第一個查詢檢查產品是否可用。然後在第二個查詢中,我們將更新購買資訊。但是,這兩個查詢執行之間,其他使用者可能已經購買了產品,導致產品不再可用。在不知道這種情況的情況下,我們的第二個查詢將根據第一個查詢的結果更新購買資訊。這將導致資料庫不一致,因為我們出售了實際上不可用的產品。
廣告