क्लाइंट-साइड संशोधन और पुनः सहेजना
MongoDB सरणी के अंदर नेस्टेड ऑब्जेक्ट के फ़ील्ड को सीधे आंशिक रूप से अपडेट करने का समर्थन नहीं करता (स्थितीय ऑपरेटर $ केवल शीर्ष-स्तरीय सरणी तत्वों के लिए काम करता है)। समाधान: दस्तावेज़ लाएं, जावास्क्रिप्ट में संशोधित करें, फिर पूरे सरणी को $set के साथ सहेजें।
उदाहरण: नेस्टेड ऑब्जेक्ट्स की सरणी के साथ दस्तावेज़
> db.updateListOfKeyValuesDemo.insertOne(
{
"StudentDetails": [
{ "StudentName": "John", "StudentAge": 23, "StudentCountryName": "US" },
{ "StudentName": "Carol", "StudentAge": 24, "StudentCountryName": "UK" },
{ "StudentName": "Bob", "StudentAge": 22, "StudentCountryName": "AUS" }
]
}
);
{ "acknowledged" : true, "insertedId" : ObjectId("5c9b5b759882024390176545") }
अपडेट लॉजिक (शेल स्क्रिप्ट)
> var documentFromCollection = db.updateListOfKeyValuesDemo.findOne({
"_id": ObjectId("5c9b5b759882024390176545")
});
> documentFromCollection.StudentDetails.forEach(function(updateStudent) {
updateStudent.StudentName = "Ramit";
});
> db.updateListOfKeyValuesDemo.update(
{ "_id": documentFromCollection._id },
{ "$set": { "StudentDetails": documentFromCollection.StudentDetails } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
सत्यापन
> db.updateListOfKeyValuesDemo.find().pretty();
आउटपुट: StudentDetails सरणी के सभी तीन ऑब्जेक्ट्स में StudentName अब "Ramit" है।
सीमाएं और विकल्प:
- यह दृष्टिकोण पूरे सरणी को फिर से लिखता है (बड़े सरणी के लिए अक्षम)।
- MongoDB 3.6+ में
arrayFiltersके साथ$[फ़िल्टर्ड स्थितीय ऑपरेटर का उपयोग करके विशिष्ट नेस्टेड फ़ील्ड को सीधे अपडेट कर सकते हैं।] - उदाहरण:
db.coll.update({}, { $set: { "StudentDetails.$[elem].StudentName": "Ramit" } }, { arrayFilters: [ { "elem.StudentAge": { $gte: 22 } } ] })।