zoukankan      html  css  js  c++  java
  • mongodb 原子操作findAndModify

    原子操作模型数据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 查询的方法可以确保只有当它是提供产品的购买信息时被更新。 而整个此事务在同一个查询中的,所以是一个原子的。

    与此相反,考虑我们可能已经保存了产品的可用性和已经购买的产品,独立的信息情形。在这种情况下,我们会先检查该产品先查询是否可用。第二个查询,我们将更新采购信息。然而,这是可能的,这两个查询的执行之间,其他一些用户已经购买的产品,它没有更多可用。如果不知道这一点,我们的第二个查询将更新基于第一个查询结果的购买信息。这将使数据库不一致,因为我们销售的产品是不具备(产品可能没有了)的。

  • 相关阅读:
    sqlmap的学习以及使用
    SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
    新版本打印控件插件
    vs2013 遇到的web性能记录器无法使用问题
    sql数据库 管理处理问题--维护计划
    nopcommerce 初学2
    控制饭庄
    递归问题==优化 还有数据库sqlreader
    Java基础 -3.2
    Java基础 -3
  • 原文地址:https://www.cnblogs.com/wangjing666/p/6844204.html
Copyright © 2011-2022 走看看