MongoDB के साथ काम करते समय ऐसे परिदृश्य आ सकते हैं जहाँ आप एक ही ऑपरेशन में कई दस्तावेज़ अपडेट करना चाहेंगे। आप चाहें तो प्रत्येक दस्तावेज़ पर लूप चलाकर उन्हें अलग-अलग अपडेट कर सकते हैं, लेकिन updateMany एक तेज़ और अधिक कुशल समाधान प्रदान करता है।
इस छोटे से ट्यूटोरियल में, हम MongoDB में updateMany ऑपरेटर का उपयोग करना सीखेंगे और सर्वोत्तम संभव प्रदर्शन प्राप्त करने के लिए क्वेरी को अनुकूलित करेंगे।
कई MongoDB दस्तावेज़ों को अपडेट करने का व्यावहारिक उदाहरण
इस अवधारणा को समझाने के लिए, एक व्यावहारिक उदाहरण लेते हैं जहाँ आप एक समय में एक से अधिक दस्तावेज़ अपडेट करना चाहेंगे।
उदाहरण के लिए निम्न डेटा को आधार मानिए:
[{"name":"Nic Raboy","title":"Master of Shenanigans","salary":50000,"last_raise_date": new Date("2013-06-01") },{"name":"Megan Grant","title":"Word Wrangler","salary":125000,"last_raise_date": new Date("2020-12-01") },{"name":"Tony Kim","title":"Alliance Czar","salary":80000,"last_raise_date": new Date("2025-02-01") },];संचालित द्वारा
ऊपर दिए गए JSON में, एक काल्पनिक कंपनी के तीन कर्मचारी हैं। कंपनी चाहती है कि जिनका वेतन कुछ समय से समायोजित नहीं हुआ है, उनकी क्षतिपूर्ति बढ़ाई जाए।
जो पात्र हैं उन्हें अपडेट करने के लिए हम MongoDB में updateMany ऑपरेटर का उपयोग कर सकते हैं। हमारे कार्य को पूरा करने के लिए, कथन कुछ इस प्रकार दिख सकता है:
db.employees.updateMany({"last_raise_date":{"$lte":newDate("2024-01-01")}},{"$mul":{"salary":1.06},"$set":{"last_raise_date":newDate()}});संचालित द्वारा
तो, ऊपर दिया गया updateMany ऑपरेशन क्या करता है?
थोड़ा पीछे हटकर देखें तो, updateMany ऑपरेटर दो पैरामीटर लेता है और एक वैकल्पिक तीसरा पैरामीटर भी हो सकता है।
पहला पैरामीटर उस डेटा का ऑब्जेक्ट है जिसे हम फ़िल्टर करना चाहते हैं।
दूसरा पैरामीटर वे परिवर्तन हैं जो हम फ़िल्टर में मिले परिणामों पर लागू करना चाहते हैं।
वैकल्पिक तीसरा पैरामीटर { “upsert”: true } हो सकता है, जो मैच न मिलने पर एक दस्तावेज़ जोड़ देगा।
इसे ध्यान में रखते हुए, हम पहले उन सभी दस्तावेज़ों को फ़िल्टर कर रहे हैं जिनका last_raise_date "2024-01-01" से पहले है। अपने बहुत ही बुनियादी डेटा सेट को देखें तो हमें पता है कि तीन में से दो दस्तावेज़ मैच कर रहे हैं:
[{"name":"Nic Raboy","title":"Master of Shenanigans","salary":50000,"last_raise_date": new Date("2013-06-01") },{"name":"Megan Grant","title":"Word Wrangler","salary":125000,"last_raise_date": new Date("2020-12-01") }];संचालित द्वारा
परिवर्तन मानदंड पैरामीटर के आधार पर फ़िल्टर किए गए दस्तावेज़ों में दो अलग-अलग परिवर्तन किए जाएंगे।
सबसे पहले, हम $mul ऑपरेटर का उपयोग करके अपने एक फ़ील्ड को किसी मान से गुणा कर रहे हैं। हमारे उदाहरण में, हम प्रत्येक पात्र कर्मचारी को वेतन में 6% की बढ़ोतरी देना चाहते हैं। यानी हम फ़ील्ड के मौजूदा मान को 1.06 से गुणा कर रहे हैं।
वेतन समायोजन का दस्तावेज़ीकरण करने और भविष्य में आकस्मिक बढ़ोतरी से बचने के लिए, हम last_raise_date को वर्तमान तिथि से अपडेट करना चाहते हैं:
यदि हम अपना updateMany ऑपरेशन फिर से चलाएँ, तो कुछ नहीं होगा क्योंकि फ़िल्टर में दिया गया last_raise_date अब हमारे तीनों दस्तावेज़ों में से किसी से मेल नहीं खाएगा।
ऊपर दिया गया केवल एक उदाहरण है, लेकिन आपका फ़िल्टर मानदंड कहीं अधिक जटिल हो सकता है, और इसी तरह, आप क्या बदलना चाहते हैं यह भी आपके उपयोग-केस पर निर्भर करते हुए अधिक जटिल हो सकता है। MongoDB के updateMany के बारे में अधिक जानने के लिए यह वीडियो देखें।
MongoDB इंडेक्स के साथ अपने अपडेट के प्रदर्शन को बढ़ाएँ
हमारे उदाहरण में, हम तीन छोटे दस्तावेज़ों के साथ काम कर रहे थे। लगभग कोई भी ऑपरेशन जो हम अपनी कलेक्शन पर चलाएँगे, तेज़ होगा क्योंकि डेटा बहुत कम है। हालाँकि, किसी प्रोडक्शन एप्लिकेशन के बारे में सोचें जहाँ आप लाखों दस्तावेज़ों के साथ काम कर रहे हों या आप अक्सर अपडेट ऑपरेशन चला रहे हों।
यदि हम लाखों दस्तावेज़ों पर updateMany ऑपरेटर का उपयोग करने की कोशिश करें, तो इसमें समय लग सकता है, जब तक कि हमारे फ़िल्टर मानदंड के लिए उपयुक्त इंडेक्स न बनाया गया हो।
हमारे उदाहरण के लिए इंडेक्स बनाने हेतु, आप कुछ इस तरह चला सकते हैं:
db.employees.createIndex({"last_raise_date":1});संचालित द्वारा
आप निम्न कमांड चलाकर यह सत्यापित कर सकते हैं कि updateMany ऑपरेशन हमारा इंडेक्स उपयोग कर रहा है:
db.runCommand({"explain":{"update":"employees","updates":[{"q":{"last_raise_date":{"$lte":newDate("2024-01-01")}},"u":{"$mul":{"salary":1.06},"$set":{"last_raise_date":newDate()}}}]},"verbosity":"allPlansExecution"});संचालित द्वारा
परिणामों में, यदि inputStage "IXSCAN" है, तो आप इंडेक्स का उपयोग कर रहे हैं और अपने updateMany प्रदर्शन को अधिकतम कर रहे हैं। यदि inputStage "COLLSCAN" है, तो इंडेक्स उपयोग नहीं हो रहा है और आपको अपने फ़िल्टर मानदंड के आधार पर इंडेक्स बनाने के तरीके पर पुनर्विचार करने की आवश्यकता हो सकती है।
किसी भी भ्रम को दूर करने के लिए, हम ऊपर runCommand का उपयोग कई दस्तावेज़ों को अपडेट करने वाले हमारे ऑपरेशन की प्रोफाइलिंग के लिए कर रहे हैं। यदि आपको प्रोफाइलर जानकारी की आवश्यकता नहीं है, तो अधिक सरल और सुरुचिपूर्ण updateMany ऑपरेशन का ही उपयोग करें।
निष्कर्ष
MongoDB में एक ही ऑपरेशन में कई दस्तावेज़ अपडेट करना, जैसा कि पूरे ट्यूटोरियल में देखा गया, कठिन कार्य नहीं है।
updateMany ऑपरेटर का उपयोग करके, हम दस्तावेज़ों से मेल खाने के लिए एक फ़िल्टर मानदंड परिभाषित कर सकते हैं और फिर परिवर्तन करने के लिए बदलावों की सूची के साथ एक परिवर्तन मानदंड। इस updateMany ऑपरेशन को और बेहतर बनाया जा सकता है यदि आप सुनिश्चित करें कि आपके फ़िल्टर मानदंड के अनुरूप सही इंडेक्स मौजूद है।
यदि आप नॉन-रिलेशनल डेटाबेस में नए हैं, तो Introduction to NoSQL कोर्स दस्तावेज़ स्टोर्स जैसे कॉन्सेप्ट्स का सहायक अवलोकन प्रदान करता है।
FAQs
MongoDB में updateOne और updateMany में क्या अंतर है?⌄
updateOne पहले मेल खाने वाले दस्तावेज़ को संशोधित करता है, जबकि updateMany उन सभी दस्तावेज़ों को अपडेट करता है जो फ़िल्टर मानदंड को पूरा करते हैं। इच्छित परिवर्तन-परिसर के आधार पर चुनें।
क्या MongoDB में updateMany को upsert के साथ उपयोग किया जा सकता है?⌄
हाँ, तीसरे आर्ग्युमेंट के रूप में { upsert: true } जोड़ने पर, यदि कोई मैच नहीं मिलता, तो नया दस्तावेज़ जोड़ दिया जाएगा। हालाँकि, यह अधिकतर updateOne के साथ उपयोग किया जाता है।
updateMany के कुछ सामान्य उपयोग-केस क्या हैं?⌄
इसे अक्सर बैच अपडेट्स के लिए उपयोग किया जाता है, जैसे कीमतों को समायोजित करना, उपयोगकर्ता स्टेटस बदलना, या बड़े डेटा सेट्स में अप्रचलित फ़ील्ड्स को साफ़ करना।
क्या updateMany कोई परिणाम डेटा लौटाता है?⌄
हाँ, यह एक ऑब्जेक्ट लौटाता है जिसमें matchedCount और modifiedCount जैसी जानकारी होती है, जो बताती है कि कितने दस्तावेज़ मैच हुए और अपडेट किए गए।
यदि updateMany में फ़िल्टर से कोई दस्तावेज़ मेल नहीं खाता तो क्या होता है?⌄
यदि कोई दस्तावेज़ मेल नहीं खाता और upsert उपयोग नहीं किया गया है, तो ऑपरेशन बिना किसी बदलाव के पूरा हो जाएगा। कोई त्रुटि नहीं फेंकी जाती।
क्या MongoDB में updateMany एटॉमिक है?⌄
नहीं, यह कई दस्तावेज़ों के पार एटॉमिक नहीं है। प्रत्येक दस्तावेज़ का अपडेट अपने-आप में एटॉमिक होता है, लेकिन सामूहिक रूप से नहीं।
मैं updateMany ऑपरेशंस के प्रदर्शन का परीक्षण कैसे कर सकता/सकती हूँ?⌄
यह जाँचने के लिए कि आपकी क्वेरी इंडेक्स का उपयोग कर रही है या कलेक्शन स्कैन कर रही है, explain() या runCommand({ explain: ... }) मेथड्स का उपयोग करें।
क्या मैं updateMany में एक से अधिक अपडेट ऑपरेटर चेन कर सकता/सकती हूँ?⌄
हाँ, MongoDB एक ही updateMany कॉल में $set, $inc, $mul आदि जैसे ऑपरेटर्स को संयोजित करने का समर्थन करता है।
updateMany ऑपरेशंस पर इंडेक्स का क्या प्रभाव पड़ता है?⌄
इंडेक्स फ़िल्टरिंग के दौरान स्कैन किए जाने वाले दस्तावेज़ों की संख्या कम करके प्रदर्शन को काफी बेहतर कर सकते हैं।
गलती से किए गए updateMany ऑपरेशन को मैं कैसे पूर्ववत करूँ?⌄
आपको बैकअप या लॉग से पुनर्स्थापित करना होगा, क्योंकि MongoDB में updateMany के लिए इन-बिल्ट रोलबैक नहीं है। हमेशा पहले स्टेजिंग पर टेस्ट करें और प्रोडक्शन डेटा का बैकअप लें।
लेखक
Nic Raboy
निक रैबॉय MongoDB में डेवलपर रिलेशंस लीड हैं, जहाँ वे Python, Java, C# और PHP डेवलपर्स की एक टीम का नेतृत्व करते हैं जो ऐसा शानदार कंटेंट बनाते हैं जिससे डेवलपर्स अपने प्रोजेक्ट्स में MongoDB को सफलतापूर्वक शामिल कर सकें। उन्हें Golang और JavaScript का अनुभव है और वे प्रायः अपने विकास से जुड़ी अनेक यात्राओं के बारे में लिखते हैं।
MongoDB के साथ काम करते समय ऐसे परिदृश्य आ सकते हैं जहाँ आप एक ही ऑपरेशन में कई दस्तावेज़ अपडेट करना चाहेंगे। आप चाहें तो प्रत्येक दस्तावेज़ पर लूप चलाकर उन्हें अलग-अलग अपडेट कर सकते हैं, लेकिन
updateManyएक तेज़ और अधिक कुशल समाधान प्रदान करता है।इस छोटे से ट्यूटोरियल में, हम MongoDB में updateMany ऑपरेटर का उपयोग करना सीखेंगे और सर्वोत्तम संभव प्रदर्शन प्राप्त करने के लिए क्वेरी को अनुकूलित करेंगे।
Python के साथ MongoDB की डेटा हैंडलिंग क्षमताओं में मजबूत नींव बनाने के लिए, Introduction to MongoDB in Python कोर्स देखें।
कई MongoDB दस्तावेज़ों को अपडेट करने का व्यावहारिक उदाहरण
इस अवधारणा को समझाने के लिए, एक व्यावहारिक उदाहरण लेते हैं जहाँ आप एक समय में एक से अधिक दस्तावेज़ अपडेट करना चाहेंगे।
उदाहरण के लिए निम्न डेटा को आधार मानिए:
ऊपर दिए गए JSON में, एक काल्पनिक कंपनी के तीन कर्मचारी हैं। कंपनी चाहती है कि जिनका वेतन कुछ समय से समायोजित नहीं हुआ है, उनकी क्षतिपूर्ति बढ़ाई जाए।
जो पात्र हैं उन्हें अपडेट करने के लिए हम MongoDB में
updateManyऑपरेटर का उपयोग कर सकते हैं। हमारे कार्य को पूरा करने के लिए, कथन कुछ इस प्रकार दिख सकता है:तो, ऊपर दिया गया
updateManyऑपरेशन क्या करता है?थोड़ा पीछे हटकर देखें तो,
updateManyऑपरेटर दो पैरामीटर लेता है और एक वैकल्पिक तीसरा पैरामीटर भी हो सकता है।{ “upsert”: true }हो सकता है, जो मैच न मिलने पर एक दस्तावेज़ जोड़ देगा।इसे ध्यान में रखते हुए, हम पहले उन सभी दस्तावेज़ों को फ़िल्टर कर रहे हैं जिनका
last_raise_date"2024-01-01" से पहले है। अपने बहुत ही बुनियादी डेटा सेट को देखें तो हमें पता है कि तीन में से दो दस्तावेज़ मैच कर रहे हैं:परिवर्तन मानदंड पैरामीटर के आधार पर फ़िल्टर किए गए दस्तावेज़ों में दो अलग-अलग परिवर्तन किए जाएंगे।
सबसे पहले, हम
$mulऑपरेटर का उपयोग करके अपने एक फ़ील्ड को किसी मान से गुणा कर रहे हैं। हमारे उदाहरण में, हम प्रत्येक पात्र कर्मचारी को वेतन में 6% की बढ़ोतरी देना चाहते हैं। यानी हम फ़ील्ड के मौजूदा मान को 1.06 से गुणा कर रहे हैं।वेतन समायोजन का दस्तावेज़ीकरण करने और भविष्य में आकस्मिक बढ़ोतरी से बचने के लिए, हम
last_raise_dateको वर्तमान तिथि से अपडेट करना चाहते हैं:यदि हम अपना
updateManyऑपरेशन फिर से चलाएँ, तो कुछ नहीं होगा क्योंकि फ़िल्टर में दिया गयाlast_raise_dateअब हमारे तीनों दस्तावेज़ों में से किसी से मेल नहीं खाएगा।ऊपर दिया गया केवल एक उदाहरण है, लेकिन आपका फ़िल्टर मानदंड कहीं अधिक जटिल हो सकता है, और इसी तरह, आप क्या बदलना चाहते हैं यह भी आपके उपयोग-केस पर निर्भर करते हुए अधिक जटिल हो सकता है। MongoDB के updateMany के बारे में अधिक जानने के लिए यह वीडियो देखें।
MongoDB इंडेक्स के साथ अपने अपडेट के प्रदर्शन को बढ़ाएँ
हमारे उदाहरण में, हम तीन छोटे दस्तावेज़ों के साथ काम कर रहे थे। लगभग कोई भी ऑपरेशन जो हम अपनी कलेक्शन पर चलाएँगे, तेज़ होगा क्योंकि डेटा बहुत कम है। हालाँकि, किसी प्रोडक्शन एप्लिकेशन के बारे में सोचें जहाँ आप लाखों दस्तावेज़ों के साथ काम कर रहे हों या आप अक्सर अपडेट ऑपरेशन चला रहे हों।
यदि हम लाखों दस्तावेज़ों पर
updateManyऑपरेटर का उपयोग करने की कोशिश करें, तो इसमें समय लग सकता है, जब तक कि हमारे फ़िल्टर मानदंड के लिए उपयुक्त इंडेक्स न बनाया गया हो।हमारे उदाहरण के लिए इंडेक्स बनाने हेतु, आप कुछ इस तरह चला सकते हैं:
आप निम्न कमांड चलाकर यह सत्यापित कर सकते हैं कि
updateManyऑपरेशन हमारा इंडेक्स उपयोग कर रहा है:परिणामों में, यदि
inputStage"IXSCAN" है, तो आप इंडेक्स का उपयोग कर रहे हैं और अपनेupdateManyप्रदर्शन को अधिकतम कर रहे हैं। यदिinputStage"COLLSCAN" है, तो इंडेक्स उपयोग नहीं हो रहा है और आपको अपने फ़िल्टर मानदंड के आधार पर इंडेक्स बनाने के तरीके पर पुनर्विचार करने की आवश्यकता हो सकती है।किसी भी भ्रम को दूर करने के लिए, हम ऊपर
runCommandका उपयोग कई दस्तावेज़ों को अपडेट करने वाले हमारे ऑपरेशन की प्रोफाइलिंग के लिए कर रहे हैं। यदि आपको प्रोफाइलर जानकारी की आवश्यकता नहीं है, तो अधिक सरल और सुरुचिपूर्णupdateManyऑपरेशन का ही उपयोग करें।निष्कर्ष
MongoDB में एक ही ऑपरेशन में कई दस्तावेज़ अपडेट करना, जैसा कि पूरे ट्यूटोरियल में देखा गया, कठिन कार्य नहीं है।
updateManyऑपरेटर का उपयोग करके, हम दस्तावेज़ों से मेल खाने के लिए एक फ़िल्टर मानदंड परिभाषित कर सकते हैं और फिर परिवर्तन करने के लिए बदलावों की सूची के साथ एक परिवर्तन मानदंड। इसupdateManyऑपरेशन को और बेहतर बनाया जा सकता है यदि आप सुनिश्चित करें कि आपके फ़िल्टर मानदंड के अनुरूप सही इंडेक्स मौजूद है।यदि आप नॉन-रिलेशनल डेटाबेस में नए हैं, तो Introduction to NoSQL कोर्स दस्तावेज़ स्टोर्स जैसे कॉन्सेप्ट्स का सहायक अवलोकन प्रदान करता है।