MongoDB-원자 연산

원자 연산을위한 모델 데이터

원 자성을 유지하기 위해 권장되는 접근 방식은 모든 관련 정보를 유지하는 것입니다.이 정보는 다음을 사용하여 단일 문서에서 자주 업데이트됩니다. embedded documents. 이렇게하면 단일 문서에 대한 모든 업데이트가 원 자성인지 확인할 수 있습니다.

productDetails라는 이름의 컬렉션을 만들고 아래에 표시된대로 문서를 삽입했다고 가정합니다.

>db.createCollection("products")
{ "ok" : 1 }
> db.productDetails.insert(
	{
		"_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"
			}
		]
	}
)
WriteResult({ "nInserted" : 1 })
>

이 문서에서는 제품을 구매 한 고객의 정보를 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"}} 
   }    
})

임베디드 문서에 대한 접근 방식과 findAndModify 쿼리를 사용하면 제품이 사용 가능한 경우에만 제품 구매 정보가 업데이트됩니다. 그리고이 트랜잭션의 전체가 동일한 쿼리에 있으며 원자 적입니다.

이와 대조적으로 제품 가용성과 제품을 구매 한 사람에 대한 정보를 별도로 보관했을 수있는 시나리오를 고려하십시오. 이 경우 첫 번째 쿼리를 사용하여 제품을 사용할 수 있는지 먼저 확인합니다. 그런 다음 두 번째 쿼리에서 구매 정보를 업데이트합니다. 그러나이 두 쿼리를 실행하는 동안 다른 사용자가 제품을 구입하여 더 이상 사용할 수 없게 될 수 있습니다. 이를 모르면 두 번째 쿼리는 첫 번째 쿼리의 결과를 기반으로 구매 정보를 업데이트합니다. 사용할 수없는 제품을 판매했기 때문에 데이터베이스가 일관성이 없게됩니다.