English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB 기본적인 연산

원자적 작업 모델 데이터

원자성을 유지하는 추천 방법은 모든 관련 정보를 유지하고, 이러한 정보가 일반적으로 포함된 문서로 함께 업데이트되는 것입니다. 이는 단일 문서의 모든 업데이트가 원자적임을 보장합니다.

이미 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 쿼리를 사용하여 보장합니다. 전체 트랜잭션은 동일한 쿼리 내에서 원자적으로 처리됩니다.

반대로, 다음과 같은 상황을 고려해 보세요: 제품의 사용 가능성과 누가 그 제품을 구매했는지에 대한 정보를 별도로 보관할 수 있습니다. 이 경우, 제품이 사용 가능한지 먼저 확인하는 첫 번째 쿼리를 사용합니다. 그런 다음, 두 번째 쿼리에서 구매 정보를 업데이트합니다. 그러나, 이 두 쿼리를 실행하는 동안 다른 사용자가 제품을 구매했을 수 있으며, 그 제품이 더 이상 사용 가능하지 않을 수 있습니다. 이 점을 모르고 두 번째 쿼리는 첫 번째 쿼리의 결과를 기반으로 구매 정보를 업데이트합니다. 이는 우리가 이미 사용 가능하지 않은 제품을 판매했음에도 불구하고 데이터베이스가 불일치하게 만듭니다.