- 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 查询的方法确保了只有在产品可用时才会更新产品购买信息。并且由于整个事务都在同一个查询中完成,因此它是原子的。
与此相反,考虑一下我们将产品可用性和购买产品者信息分开存储的情况。在这种情况下,我们将首先使用第一个查询检查产品是否可用。然后在第二个查询中,我们将更新购买信息。但是,这两个查询执行之间,其他用户可能已经购买了产品,导致产品不再可用。在不知道这种情况的情况下,我们的第二个查询将根据第一个查询的结果更新购买信息。这将导致数据库不一致,因为我们出售了实际上不可用的产品。
广告