MongoDB में findAndModify और अपडेट के बीच क्या अंतर है?


175

मैं findAndModifyMongoDB में विधि से थोड़ा भ्रमित हूं । updateविधि पर इसका क्या लाभ है ? मेरे लिए, ऐसा लगता है कि यह केवल आइटम को पहले लौटाता है और फिर इसे अपडेट करता है। लेकिन मुझे पहले आइटम वापस करने की आवश्यकता क्यों है? मैं MongoDB: निश्चित मार्गदर्शिका को पढ़ता हूं और यह कहता है कि यह कतारों में हेरफेर करने और अन्य कार्यों को करने के लिए आसान है जिन्हें गेट-एंड-सेट शैली की परमाणुता की आवश्यकता होती है। लेकिन मुझे समझ नहीं आया कि यह कैसे हासिल होता है। क्या कोई मुझे यह समझा सकता है?

जवाबों:


153

यदि आप कोई आइटम लाते हैं और फिर उसे अपडेट करते हैं, तो उन दो चरणों के बीच एक अन्य थ्रेड द्वारा एक अद्यतन हो सकता है। यदि आप किसी आइटम को पहले अपडेट करते हैं और फिर उसे प्राप्त करते हैं, तो बीच-बीच में एक और अपडेट हो सकता है और आपने जो अपडेट किया है, उससे अलग आइटम आपको वापस मिलेगा।

इसे "परमाणु" करने का मतलब है कि आपको इस बात की गारंटी है कि आप वही अपडेट वापस कर रहे हैं जो आप अपडेट कर रहे हैं - यानी बीच में कोई अन्य ऑपरेशन नहीं हो सकता है।


6
मैं अभी भी थोड़ा भ्रमित हूं। कैसे findAndModifyगारंटी देता है कि इसके साथ कोई अन्य अपडेट ऑपरेशन हस्तक्षेप नहीं कर रहा है?
chaonextdoor

78
@chaonextdoor findAndModify डेटाबेस को तब लॉक करता है जब वह ऑपरेशन शुरू करता है ताकि जब वह चल रहा हो तो कोई अन्य ऑपरेशन प्रोसेस न कर सके। जब यह ऑपरेशन पूरा करता है तो यह लॉक को रिलीज़ करता है।
लीचा

4
findAndModify वास्तव में अनुरोध के संशोधित भाग तक ताला प्राप्त नहीं करता है। इसलिए कई प्रक्रियाओं के लिए एक ही रिकॉर्ड को अपडेट करने में सक्षम होना संभव है।
मार्क अन्सवर्थ

5
@MarkUnsworth 10gen के साथ एक समर्थन का मामला खोलता है - अगर findAndModify के साथ लॉक करने में एक बग है, तो मैं आपको गारंटी दे सकता हूं कि इंजीनियर इसे ठीक करना चाहेंगे। अगर ऐसा होता तो हम बहुत से लोगों को इस व्यवहार की रिपोर्ट करते हुए देखते थे, लेकिन findAndModify बहुत ज्यादा हर किसी के लिए डिज़ाइन किया गया काम करता है जो इसका उपयोग कर रहा है - ऐसे मामले जहां ऐसा लग रहा था कि यह ग्राहक पक्ष पर तर्क या कार्यान्वयन कीड़े के लिए नहीं आया था। , लेकिन निश्चित रूप से जटिल सॉफ्टवेयर में हमेशा एक बग हो सकता है।
अस्य कामस्की

4
@AsyaKamsky मैं आपके साथ बहस करने पर विचार कर रहा था, लेकिन तब आपको एहसास हुआ कि आप सही हैं इसलिए अब मैं सोच रहा हूं कि मुझे माफी मांगनी चाहिए। माफ़ करना!
16

54

findAndModify दस्तावेज़ लौटाता है, अद्यतन नहीं करता है।

अगर मैं ड्वाइट मेरिमैन (मूल लेखक के एक लेखक) को सही ढंग से समझ गया, तो एकल दस्तावेज़ को संशोधित करने के लिए अद्यतन का उपयोग करना (यानी "बहु": असत्य) भी परमाणु है। वर्तमान में, इसका उपयोग करके बराबर अद्यतन करने से भी तेज होना चाहिए findAndModify


31

से MongoDB डॉक्स (जोर जोड़ा):

  • डिफ़ॉल्ट रूप से, दोनों ऑपरेशन एकल दस्तावेज़ को संशोधित करते हैं। हालाँकि, इसके बहु विकल्प के साथ अद्यतन () विधि एक से अधिक दस्तावेज़ों को संशोधित कर सकती है

  • यदि कई दस्तावेज़ अपडेट मापदंड से मेल खाते हैं, तो findAndModify () के लिए, आप एक प्रकार का नियंत्रण निर्दिष्ट कर सकते हैं , जिस पर नियंत्रण करने के लिए कुछ दस्तावेज़ प्रदान करें। अद्यतन के डिफ़ॉल्ट व्यवहार के साथ () विधि, आप निर्दिष्ट नहीं कर सकते कि कौन सा दस्तावेज़ अद्यतन करने के लिए जब एकाधिक दस्तावेज़ मेल खाते हैं।

  • डिफ़ॉल्ट रूप से, findAndModify () विधि दस्तावेज़ का पूर्व-संशोधित संस्करण लौटाती है । अपडेट किए गए दस्तावेज़ को प्राप्त करने के लिए, नए विकल्प का उपयोग करें। अद्यतन () विधि लिखता है लिखता है। ऑब्जेक्ट ऑब्जेक्ट जिसमें ऑपरेशन की स्थिति है। अद्यतन किए गए दस्तावेज़ को वापस करने के लिए, खोज () विधि का उपयोग करें। हालाँकि, अन्य अद्यतनों ने आपके अद्यतन और दस्तावेज़ पुनर्प्राप्ति के बीच दस्तावेज़ को संशोधित किया हो सकता है। इसके अलावा, यदि अपडेट में केवल एक ही दस्तावेज़ संशोधित किया गया है, लेकिन कई दस्तावेज़ मेल खाते हैं, तो आपको अपडेट किए गए दस्तावेज़ की पहचान करने के लिए अतिरिक्त तर्क का उपयोग करना होगा।

  • MongoDB 3.2 से पहले, आप डिफ़ॉल्ट लेखन चिंता को ओवरराइड करने के लिए findAndModify () के लिए एक लिखित चिंता निर्दिष्ट नहीं कर सकते हैं जबकि आप MongoDB 2.6 के बाद से अपडेट () विधि के लिए एक लेखन चिंता निर्दिष्ट कर सकते हैं

किसी एकल दस्तावेज़ को संशोधित करते समय, दोनों findAndModify () और अद्यतन () विधि परमाणु दस्तावेज़ को अद्यतन करते हैं।


1
आप हमेशा अद्यतन को अद्यतन लिखने के लिए चिंता निर्दिष्ट कर सकते हैं। इसके अलावा, 3.2 (3.1.1 तकनीकी रूप से) के साथ-साथ आप खोजने के लिए चिंता भी लिख सकते हैं। jira.mongodb.org/browse/SERVER-6558
Asya Kamsky

मैंने पाया है कि MongDB 3.6 में, हालांकि डॉक राज्य findAndModify()डिफ़ॉल्ट रूप से केवल एक डॉक्टर को संशोधित करता है और update()एक या एक से अधिक डॉक्टर को अपडेट कर सकता है, जब मैं एक का उपयोग करता हूं arrayFilters, findAndModify()सभी मैचों को अपडेट करता है। शायद यह एक बग है ??
पश्चिमीगंज

कोई बग नहीं है - arrayFilters आपको कई सरणी तत्वों को अपडेट करने की अनुमति देता है, लेकिन वे अभी भी एक ही दस्तावेज़ में हैं।
अस्य कामस्की

10

उपयोग के मामलों का एक उपयोगी वर्ग काउंटर और समान मामले हैं। उदाहरण के लिए, इस कोड (MongoDB परीक्षणों में से एक) पर एक नज़र डालें: find_and_modify4.js

इस प्रकार, findAndModifyआप काउंटर को बढ़ाते हैं और एक चरण में इसके बढ़े हुए मूल्य को प्राप्त करते हैं। तुलना करें: यदि आप (ए) दो चरणों में इस ऑपरेशन को करते हैं और कोई और (बी) आपके चरणों के बीच एक ही ऑपरेशन करता है तो ए और बी को दो अलग-अलग (संभव मुद्दों का सिर्फ एक उदाहरण) के बजाय एक ही अंतिम काउंटर मान मिल सकता है।


0

हमने काउंटर ऑपरेशन (इंक या डीईसी) और अन्य एकल फ़ील्ड म्यूट मामलों के लिए findAndModify () का उपयोग किया। Couchbase से MongoDB के लिए हमारे आवेदन को माइग्रेट करते हुए, मैंने इस API को कोड को बदलने के लिए पाया जो GetAndlock (), स्थानीय रूप से सामग्री को संशोधित करता है, को बचाने और Get () को फिर से अद्यतन किए गए दस्तावेज़ को लाने के लिए प्रतिस्थापित करता है। MongoDB के साथ, मैंने अभी-अभी इस एकल API का उपयोग किया है जो अद्यतन दस्तावेज़ को लौटाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.