MongoDB में db.collection.findAndModify()
विधि संशोधित करती है और एकल दस्तावेज़ लौटाती है।
collection
भाग उस संग्रह का नाम है जिसके साथ ऑपरेशन करना है।
उदाहरण
मान लीजिए हमारे पास pets
. नामक संग्रह है जिसमें निम्नलिखित दस्तावेज शामिल हैं:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
हम db.collection.findAndModify()
. का उपयोग कर सकते हैं उन दस्तावेज़ों में से किसी एक को संशोधित करने की विधि।
db.pets.findAndModify({
query: { type: "Dog" },
update: { type: "Cow" }
})
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
डिफ़ॉल्ट रूप से, यह मूल दस्तावेज़ लौटाता है (संशोधित संस्करण नहीं)।
ध्यान दें कि संग्रह में दो कुत्ते होने के बावजूद केवल एक कुत्ते को अपडेट किया गया था।
आइए संग्रह की जाँच करें।
db.pets.find()
परिणाम:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
हम देख सकते हैं कि पहले दस्तावेज़ में अब कुत्ते की जगह गाय है। हालांकि, हम यह भी देख सकते हैं कि दस्तावेज़ का नाम फ़ील्ड गायब हो गया है।
ऐसा इसलिए है, क्योंकि जब आप किसी दस्तावेज़ को update
. में पास करते हैं तर्क, db.collection.findAndModify()
एक प्रतिस्थापन करता है।
अपडेट ऑपरेटर का उपयोग करना
अगर हम किसी फ़ील्ड को अपडेट करना चाहते हैं, लेकिन बाकी दस्तावेज़ को बरकरार रखना चाहते हैं, तो हमें अपने दस्तावेज़ में प्रासंगिक अपडेट ऑपरेटर एक्सप्रेशन शामिल करना होगा।
संग्रह की वर्तमान स्थिति के साथ, आइए एक और findAndModify()
का प्रदर्शन करें इसके खिलाफ कार्रवाई, लेकिन इस बार हम $set
. का उपयोग करेंगे अद्यतन ऑपरेटर केवल उस फ़ील्ड को सेट करने के लिए जिसे हम बदलना चाहते हैं।
db.pets.findAndModify({
query: { type: "Dog" },
update: { $set: { type: "Horse" } }
})
परिणाम:
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
इस बार बचे हुए कुत्ते को अपडेट किया गया।
आइए संग्रह पर एक नज़र डालें।
db.pets.find()
परिणाम:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
इस बार प्रासंगिक फ़ील्ड को अपडेट किया गया, और बाकी दस्तावेज़ बरकरार रहे।
संशोधित दस्तावेज़ लौटाएं
डिफ़ॉल्ट रूप से, जब आप db.collection.findAndModify()
का उपयोग करते हैं, तो मूल दस्तावेज़ वापस कर दिया जाता है .
यदि आप इसके बजाय संशोधित दस्तावेज़ वापस करना चाहते हैं, तो new
. का उपयोग करें पैरामीटर।
डिफ़ॉल्ट रूप से, यह new: false
है , जिसके परिणामस्वरूप मूल दस्तावेज़ वापस किया जा रहा है। लेकिन निर्दिष्ट करना new: true
बदले में संशोधित दस्तावेज़ लौटाए जा रहे हैं।
चलिए एक और संशोधन करते हैं, लेकिन इस बार हम new: true
. का उपयोग करेंगे ।
db.pets.findAndModify({
query: { name: "Meow" },
update: { $set: { name: "Scratch" } },
new: true
})
परिणाम:
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }
इसलिए हमने नाम बदल दिया Meow
करने के लिए Scratch
और आउटपुट हमारे परिवर्तनों को दर्शाता है।
अप्सर्ट
आप upsert: true
. निर्दिष्ट करके अप्सर्ट प्रदर्शन कर सकते हैं ।
एक अप्सर्ट एक विकल्प है जिसका उपयोग आप अपडेट ऑपरेशंस पर कर सकते हैं। यदि निर्दिष्ट दस्तावेज़ मौजूद नहीं है, तो एक नया डाला जाता है। अगर यह करता है मौजूद है, तब मूल दस्तावेज़ अपडेट किया जाता है (और कोई दस्तावेज़ सम्मिलित नहीं किया जाता है)।
upsert: false
का उपयोग करने का उदाहरण
यहां एक गैर-मौजूद दस्तावेज़ को अपडेट करने का प्रयास करने का एक उदाहरण दिया गया है जब upsert: false
।
db.pets.findAndModify({
query: { _id: 4 },
update: { _id: 4, name: "Fetch", type: "Dog" },
new: true
})
परिणाम:
null
दस्तावेज़ संग्रह में मौजूद नहीं था और इसलिए findAndModify()
लौटा null
. भले ही हमने upsert: false
. निर्दिष्ट नहीं किया हो , हम जानते हैं कि यह गलत था क्योंकि यह डिफ़ॉल्ट मान है (अर्थात यह वह मान है जिसका उपयोग तब किया जाता है जब आप अप्सर्ट विकल्प निर्दिष्ट नहीं करते हैं)।
यदि हम संग्रह में एक और नज़र डालें, तो हम देख सकते हैं कि दस्तावेज़ को ऊपर नहीं रखा गया था।
db.pets.find()
परिणाम:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Scratch", "type" : "Cat" }
upsert: true
अब यह फिर से है, लेकिन इस बार हम निर्दिष्ट करते हैं upsert: true
।
db.pets.findAndModify({
query: { _id: 4 },
update: { _id: 4, name: "Fetch", type: "Dog" },
new: true,
upsert: true
})
परिणाम:
{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }
इस बार एक नया दस्तावेज़ जोड़ा गया है और हम ऊपर वाले दस्तावेज़ को आउटपुट के रूप में देखते हैं (क्योंकि हमने new: true
निर्दिष्ट किया है। )।
आइए फिर से संग्रह की जाँच करें।
db.pets.find()
परिणाम:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Scratch", "type" : "Cat" } { "_id" : 4, "name" : "Fetch", "type" : "Dog" }
तो हम देख सकते हैं कि नया दस्तावेज़ वास्तव में ऊपर रखा गया था।
सरणी फ़िल्टर पैरामीटर
सरणियों के साथ काम करते समय, आप arrayFilters
. का उपयोग कर सकते हैं स्थितीय $
. के साथ पैरामीटर ऑपरेटर यह निर्धारित करने के लिए कि कौन से सरणी तत्वों को अद्यतन करना है। यह आपको किसी सरणी तत्व को उसके मान के आधार पर अपडेट करने में सक्षम बनाता है, भले ही आपको उसकी स्थिति का पता न हो।
उदाहरण के लिए, मान लें कि हमारे पास players
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
हम केवल उन सरणी तत्वों को अपडेट करने के लिए निम्न क्वेरी चला सकते हैं जिनका मान एक निश्चित राशि से अधिक है (इस मामले में 10)।
db.players.findAndModify({
query: { scores: { $gte: 10 } },
update: { $set: { "scores.$[e]" : 10 } },
arrayFilters: [ { "e": { $gte: 10 } } ]
})
परिणाम:
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
जैसा कि अपेक्षित था, यह केवल एक दस्तावेज़ को अपडेट करता है, भले ही दो दस्तावेज़ मानदंड से मेल खाते हों।
दस्तावेज़ अब इस तरह दिखते हैं।
db.players.find()
परिणाम:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
दस्तावेज़ 2 में दो सरणी तत्व अपडेट किए गए थे, क्योंकि वे तत्व मानदंड से मेल खाते थे।
अधिक जानकारी
db.collection.findAndModify()
विधि अन्य मापदंडों को भी स्वीकार करती है, जैसे कि writeConcern
, collation
, bypassDocumentValidation
और भी बहुत कुछ।
db.collections.findAndModify()
. के लिए MongoDB दस्तावेज़ देखें अधिक जानकारी के लिए।