MongoDB में db.collection.findOneAndUpdate()
विधि filter
. के आधार पर एकल दस्तावेज़ को अपडेट करती है और sort
मानदंड।
collection
भाग उस संग्रह का नाम है जिसके साथ ऑपरेशन करना है।
उदाहरण
मान लीजिए हमारे पास pets
. नामक संग्रह है जिसमें निम्नलिखित दस्तावेज शामिल हैं:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
हम उपयोग कर सकते हैं db.collection.findOneAndUpdate()
उन दस्तावेज़ों में से किसी एक को अद्यतन करने की विधि।
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Cow" } }
)
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
डिफ़ॉल्ट रूप से, यह मूल दस्तावेज़ लौटाता है (संशोधित संस्करण नहीं)।
ध्यान दें कि संग्रह में दो कुत्ते होने के बावजूद केवल एक कुत्ते को अपडेट किया गया था।
आइए संग्रह की जाँच करें।
db.pets.find()
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
हम देख सकते हैं कि पहले दस्तावेज़ में अब कुत्ते की जगह गाय है।
संशोधित दस्तावेज़ लौटाएं
डिफ़ॉल्ट रूप से, जब आप db.collection.findOneAndUpdate()
का उपयोग करते हैं, तो मूल दस्तावेज़ वापस कर दिया जाता है .
यदि आप इसके बजाय संशोधित दस्तावेज़ वापस करना चाहते हैं, तो returnNewDocument
. का उपयोग करें पैरामीटर।
आइए एक और संशोधन करें, लेकिन इस बार हम returnNewDocument: true
use का उपयोग करेंगे ।
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Horse" } },
{ returnNewDocument: true }
)
परिणाम:
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
इस बार दूसरे कुत्ते को अपडेट किया गया। इस मामले में, हमने इसे घोड़े में बदल दिया, और हम देख सकते हैं कि वापसी दस्तावेज़ इसे दर्शाता है।
अप्सर्ट
एक अप्सर्ट एक विकल्प है जिसका उपयोग आप अपडेट ऑपरेशंस पर कर सकते हैं। यदि निर्दिष्ट दस्तावेज़ मौजूद नहीं है, तो एक नया डाला जाता है। अगर यह करता है मौजूद है, तब मूल दस्तावेज़ अपडेट किया जाता है (और कोई दस्तावेज़ सम्मिलित नहीं किया जाता है)।
आप upsert: true
. निर्दिष्ट करके अप्सर्ट प्रदर्शन कर सकते हैं ।
upsert: false
का उपयोग करने का उदाहरण
सबसे पहले, यहां एक गैर-मौजूद दस्तावेज़ को अपडेट करने का प्रयास करने का एक उदाहरण दिया गया है जब upsert: false
।
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
returnNewDocument: true
}
)
परिणाम:
null
दस्तावेज़ संग्रह में मौजूद नहीं था और इसलिए findOneAndUpdate()
लौटा 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.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
upsert: true,
returnNewDocument: true
}
)
परिणाम:
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }
इस बार एक नया दस्तावेज़ जोड़ा गया है और हम ऊपर वाले दस्तावेज़ को आउटपुट के रूप में देखते हैं (क्योंकि हमने returnNewDocument: true
निर्दिष्ट किया है। )।
आइए फिर से संग्रह की जाँच करें।
db.pets.find()
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Barry", "type" : "Badger" }
तो हम देख सकते हैं कि नया दस्तावेज़ वास्तव में ऊपर रखा गया था।
द arrayFilters
पैरामीटर
सरणियों के साथ काम करते समय, आप arrayFilters
. का उपयोग कर सकते हैं स्थितीय $
. के साथ पैरामीटर ऑपरेटर यह निर्धारित करने के लिए कि कौन से सरणी तत्वों को अद्यतन करना है। यह आपको किसी सरणी तत्व को उसके मान के आधार पर अपडेट करने में सक्षम बनाता है, भले ही आपको उसकी स्थिति का पता न हो।
उदाहरण के लिए, मान लें कि हमारे पास players
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
हम केवल उन सरणी तत्वों को अपडेट करने के लिए निम्न क्वेरी चला सकते हैं जिनका मान एक निश्चित राशि से अधिक है (इस मामले में 10)।
db.players.findOneAndUpdate(
{ scores: { $gte: 10 } },
{ $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.findOneAndUpdate()
विधि अन्य मापदंडों को भी स्वीकार करती है, जैसे कि projection
(वापस जाने के लिए फ़ील्ड का एक सबसेट निर्दिष्ट करने के लिए), sort
, maxTimeMS
, और collation
।
db.collections.findOneAndUpdate()
. के लिए MongoDB दस्तावेज़ देखें अधिक जानकारी के लिए।