MongoDB में नेस्टेड सरणी के अंदर सबडॉक्यूमेंट फील्ड्स को अपडेट करने के लिए, फिल्टर और अपडेट पथ दोनों में डॉट नोटेशन के साथ स्थिति ऑपरेटर $ का उपयोग करें।
उदाहरण: स्कोर सरणी वाला दस्तावेज़
> db.demo378.insertOne({
Name: 'Chris',
details: [
{ id: 101, Score: 56 },
{ id: 102, Score: 78 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a758a2ae06a1609a00b0f") }
दस्तावेज़ देखना
> db.demo378.find();
आउटपुट: दो सबडॉक्यूमेंट्स वाली सरणी।
अपडेट: id=102 वाले सबडॉक्यूमेंट के Score को 8 घटाएं
> db.demo378.update(
{ Name: "Chris", "details.id": 102 },
{ $inc: { "details.$.Score": -8 } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
परिणाम जांचें
> db.demo378.find();
आउटपुट: दूसरा सबडॉक्यूमेंट अब Score: 70 दिखाता है।
व्याख्या
- फिल्टर
{Name:"Chris", "details.id":102}दस्तावेज़ और सरणी के अंदर विशिष्ट तत्व से मेल खाता है। details.$.Scoreमें$फिल्टर से मेल खाने वाले सरणी तत्व (id=102) को संदर्भित करता है।$incउस तत्व केScoreको -8 से बढ़ाता है।
सभी मिलान वाले तत्वों को अपडेट करने के लिए (MongoDB 3.6+)
arrayFilters के साथ फ़िल्टर्ड स्थितीय ऑपरेटर $[identifier] का उपयोग करें:
> db.demo378.updateOne(
{ Name: "Chris" },
{ $inc: { "details.$[elem].Score": -8 } },
{ arrayFilters: [ { "elem.id": 102 } ] }
);
सबडॉक्यूमेंट जोड़ें/हटाएं
- जोड़ें:
{ $push: { "details": { id: 103, Score: 90 } } } - हटाएं:
{ $pull: { "details": { id: 102 } } }