•   MongoDB教程
  • MongoDB快速入门
  • MongoDB历史
  • MongoDB特点
  • MongoDB数据库的优点
  • MongoDB安装配置(Windows)
  • MongoDB安装配置(Ubuntu)
  • MongoDB安装配置(RedHat/CentOS)
  • MongoDB数据建模
  • MongoDB创建数据库
  • MongoDB删除数据库
  • MongoDB创建集合
  • MongoDB删除集合
  • MongoDB数据类型
  • MongoDB插入文档
  • MongoDB查询文档
  • MongoDB更新文档
  • MongoDB删除文档
  • MongoDB投影(选择字段)
  • MongoDB限制记录数
  • MongoDB排序记录
  • MongoDB索引
  • MongoDB聚合
  • MongoDB复制
  • MongoDB分片
  • MongoDB备份与恢复
  • MongoDB部署
  • Java连接MongoDB操作
  • Python连接MongoDB操作
  • PHP连接MongoDB操作
  • Ruby连接MongoDB操作
  • 高级部分
  • MongoDB关联关系
  • MongoDB数据库引用
  • MongoDB覆盖查询
  • MongoDB分析查询
  • MongoDB原子操作
  • MongoDB高级索引
  • MongoDB索引限制
  • MongoDB ObjectId
  • MongoDB Map Reduce
  • MongoDB文本搜索
  • MongoDB正则表达式
  • MongoDB GridFS
  • MongoDB固定循环集合
  • MongoDB自动递增序列
  • 用户及安全
  • MongoDB安全检查表
  • MongoDB认证
  • MongoDB用户
  • MongoDB添加用户
  • MongoDB启用身份验证
  • MongoDB管理用户和角色
  • MongoDB更改用户密码和自定义数据

MongoDB原子操作

MongoDB不支持多文档原子事务。 但是,它可以为单个文档提供了原子操作。 因此,如果文档有一百个字段,则更新语句将更新或不更新所有字段的值,因此在原始级别保持原子性。

原子操作模型数据

维持原子性的推荐方法是将所有相关信息保存在一起,并使用嵌入式文档在一个文档中一起更新。 这将确保单个文档的所有更新都是原子的。

考虑以下产品文件 -

{
   "_id":1,
   "product_name": "Huawei P9",
   "category": "mobiles",
   "product_total": 5,
   "product_available": 3,
   "product_bought_by": [
      {
         "customer": "Kobe",
         "date": "2017-07-08"
      },
      {
         "customer": "Maxsu",
         "date": "2018-07-28"
      }
   ]
}

在上面这个文档中,已经在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:"Curry",date:"2017-08-08"}} 
   }    
})

嵌入式文档和使用findAndModify查询的方法确保产品购买信息仅在产品可用时才更新。 而整个这个事务在同一个查询中是原子的。

与此相反的是如果分别保留产品数量,以及谁购买产品的信息。在这种情况下,我们将首先使用第一个查询检查产品是否可用。然后在第二个查询中更新购买信息。 但是,有可能在执行这两个查询时(还未执行完),其他一些用户已经购买了该产品,并且此产品缺货了。但是由于程序执行过程中并不知晓,第二个查询将根据第一个查询的结果更新购买信息。这会导致数据库不一致,因为产品已经没有库存,但是仍然断续销售。


上一篇:MongoDB分析查询下一篇:MongoDB高级索引