59519751 发表于 2017-12-15 16:14:04

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 查询的方法可以确保只有当它是提供产品的购买信息时被更新。 而整个此事务在同一个查询中的,所以是一个原子的。
  与此相反,考虑我们可能已经保存了产品的可用性和已经购买的产品,独立的信息情形。在这种情况下,我们会先检查该产品先查询是否可用。第二个查询,我们将更新采购信息。然而,这是可能的,这两个查询的执行之间,其他一些用户已经购买的产品,它没有更多可用。如果不知道这一点,我们的第二个查询将更新基于第一个查询结果的购买信息。这将使数据库不一致,因为我们销售的产品是不具备(产品可能没有了)的。
页: [1]
查看完整版本: mongodb 原子操作findAndModify