- 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 - 对象 ID
- MongoDB - 映射减少
- MongoDB - 文本搜索
- MongoDB - 正则表达式
- 与 Rockmongo 合作
- MongoDB-GridFS
- MongoDB - 上限集合
- 自动递增序列
- MongoDB 有用资源
- MongoDB - 问题与解答
- MongoDB - 快速指南
- MongoDB - 有用的资源
- MongoDB - 讨论
MongoDB - Atomics操作
Atomics操作的模型数据
维护Atomics性的推荐方法是保留所有相关信息,这些信息经常使用嵌入文档在单个文档中一起更新。这将确保单个文档的所有更新都是Atomics的。
假设我们创建了一个名为 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命令来实现此功能,因为它会在同一个 go 中搜索和更新文档。
>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 查询可确保仅在产品可用时更新产品购买信息。整个事务都在同一个查询中,是Atomics的。
与此相反,考虑这样一种情况:我们可能分别保留产品可用性和有关谁购买了该产品的信息。在这种情况下,我们将首先使用第一个查询检查产品是否可用。然后在第二个查询中我们将更新购买信息。但是,在执行这两个查询之间,其他用户可能已经购买了该产品,并且该产品不再可用。在不知道这一点的情况下,我们的第二次查询将根据第一次查询的结果更新购买信息。这将使数据库不一致,因为我们销售的产品不可用。