MongoDB - परमाणु संचालन

परमाणु संचालन के लिए मॉडल डेटा

परमाणुता को बनाए रखने के लिए अनुशंसित दृष्टिकोण सभी संबंधित जानकारी रखने के लिए होगा, जिसका उपयोग करके एक ही दस्तावेज़ में अक्सर एक साथ अपडेट किया जाता है embedded documents। यह सुनिश्चित करेगा कि किसी एकल दस्तावेज़ के सभी अपडेट परमाणु हैं।

मान लें कि हमने उत्पाद नाम के साथ एक संग्रह बनाया है और उसमें एक दस्तावेज डाला है जैसा कि नीचे दिखाया गया है -

>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 क्वेरी का उपयोग करने के बारे में हमारा दृष्टिकोण यह सुनिश्चित करता है कि उत्पाद की खरीद की जानकारी केवल तभी अपडेट की जाती है जब वह उत्पाद उपलब्ध हो। और यह सारा लेन-देन एक ही क्वेरी में हो रहा है, परमाणु है।

इसके विपरीत, उस परिदृश्य पर विचार करें जहां हमने उत्पाद की उपलब्धता और उत्पाद को किसने खरीदा है, इसकी जानकारी अलग से रखी होगी। इस मामले में, हम पहले जांच करेंगे कि क्या उत्पाद पहले क्वेरी का उपयोग करके उपलब्ध है। फिर दूसरी क्वेरी में हम खरीद जानकारी को अपडेट करेंगे। हालांकि, यह संभव है कि इन दो प्रश्नों के निष्पादन के बीच, कुछ अन्य उपयोगकर्ता ने उत्पाद खरीदा हो और यह अधिक उपलब्ध न हो। यह जानने के बिना, हमारी दूसरी क्वेरी हमारी पहली क्वेरी के परिणाम के आधार पर खरीद जानकारी को अपडेट करेगी। यह डेटाबेस को असंगत बना देगा क्योंकि हमने एक उत्पाद बेचा है जो उपलब्ध नहीं है।