开发学院

您的位置:首页>教程>正文

教程正文

MongoDB 原子操作

MongoDB 原子操作

  MongoDB不支持多文档原子事务。但是,它确实对单个文档提供了原子操作。因此,如果文档有数百个字段,update语句将更新所有字段或不更新任何字段,从而在文档级别保持原子性。

原子操作的模型数据

  维护原子性的建议方法是保留所有相关信息,这些信息经常使用嵌入文档在单个文档中一起更新。这将确保单个文档的所有更新都是原子的。

  请考虑以下product文档 −

{
   "_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_by字段中。现在,每当新客户购买产品时,我们将首先使用product_available字段检查产品是否仍然可用。如果可用,我们将降低product_available字段的值,并在product_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"}} 
   }    
})

  我们的嵌入文档和使用findAndModify查询的方法确保只有在产品可用时才更新产品购买信息。并且整个事务处于相同的查询中,是原子的。

  与此相反,请考虑我们可能分别保持产品可用性和购买者信息的场景。在这种情况下,我们将首先使用第一个查询检查产品是否可用。然后在第二个查询中,我们将更新购买信息。但是,在执行这两个查询之间,可能有其他用户购买了该产品,但该产品不再可用。在不知道这一点的情况下,我们的第二个查询将根据第一个查询的结果更新购买信息。这将使数据库不一致,因为我们销售的产品不可用。