mongodb 原子操作findAndModify
2017-05-12 10:07
381 查看
原子操作模型数据findAndModify
推荐的方法,以保持原子将保留所有的相关信息,这些信息经常更新,一个文档中使用嵌入文档。这将确保所有的更新为一个单一文档是原子。考虑下面的 products 文档:
{ "_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" } ] }
在本文档中,我们已经嵌入客户买该产品的信息在 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"}} } }) 以上的意思是,当id为2的商品,available的值大于0时,将执行更新:available - 1 ,并且将product_bought_by:{customer:"rob",date:"9-Jan-2014"}}将入到文档中
嵌入式文档并使用 findAndModify 查询的方法可以确保只有当它是提供产品的购买信息时被更新。 而整个此事务在同一个查询中的,所以是一个原子的。
与此相反,考虑我们可能已经保存了产品的可用性和已经购买的产品,独立的信息情形。在这种情况下,我们会先检查该产品先查询是否可用。第二个查询,我们将更新采购信息。然而,这是可能的,这两个查询的执行之间,其他一些用户已经购买的产品,它没有更多可用。如果不知道这一点,我们的第二个查询将更新基于第一个查询结果的购买信息。这将使数据库不一致,因为我们销售的产品是不具备(产品可能没有了)的。
相关文章推荐
- mongodb,update和 findAndModify操作。
- mongodb-findAndModify(来源于mongodb权威指南)
- 使用mongodb的findAndModify命令来进行数据同步
- 多线程下变量-原子操作 __sync_fetch_and_add等等
- 线程下变量-原子操作 __sync_fetch_and_add
- 在vs2005里面使用regular expression 进行 find and replace操作
- linux无锁化编程--__sync_fetch_and_add系列原子操作函数
- [转] 多线程下变量-gcc原子操作 __sync_fetch_and_add等
- 误操作Ghost整个硬盘,FindAndMount & DiskGenius解决方案
- 多线程下变量-原子操作 __sync_fetch_and_add等等
- MongoDB常用操作一查询find方法db.collection_name.find()
- Java实现对MongoDB的AND、OR和IN操作
- Linux 设备驱动--- 并发 与 竞态 --- atomic_t --- atomic_dec_and_test --- 原子操作
- java对mongodb的and, in, or 常用操作
- gcc 原子操作 compare and swap系列
- 多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作
- 多线程下变量-原子操作 __sync_fetch_and_add等等
- MongoDB学习系列12:Java实现对MongoDB的AND、OR和IN操作
- 多线程下变量-原子操作 __sync_fetch_and_add等等
- MongoDB的find操作详解