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 ทำให้แน่ใจว่าข้อมูลการซื้อผลิตภัณฑ์ได้รับการอัปเดตก็ต่อเมื่อมีข้อมูลในผลิตภัณฑ์เท่านั้น และธุรกรรมทั้งหมดนี้อยู่ในแบบสอบถามเดียวกันคือ atomic

ในทางตรงกันข้ามให้พิจารณาสถานการณ์ที่เราอาจเก็บความพร้อมจำหน่ายสินค้าและข้อมูลว่าใครเป็นผู้ซื้อผลิตภัณฑ์แยกต่างหาก ในกรณีนี้เราจะตรวจสอบก่อนว่ามีผลิตภัณฑ์หรือไม่โดยใช้แบบสอบถามแรก จากนั้นในแบบสอบถามที่สองเราจะอัปเดตข้อมูลการซื้อ อย่างไรก็ตามเป็นไปได้ว่าระหว่างการดำเนินการของข้อความค้นหาทั้งสองนี้ผู้ใช้รายอื่นบางรายได้ซื้อผลิตภัณฑ์และไม่สามารถใช้ได้อีกต่อไป โดยไม่ทราบสิ่งนี้แบบสอบถามที่สองของเราจะอัปเดตข้อมูลการซื้อตามผลลัพธ์ของการสืบค้นแรกของเรา สิ่งนี้จะทำให้ฐานข้อมูลไม่สอดคล้องกันเนื่องจากเราได้ขายผลิตภัณฑ์ที่ไม่มีจำหน่าย