MongoDB एग्रीगेशन पाइपलाइन दस्तावेज़ों को संशोधित नहीं कर सकती; वे केवल पढ़ते हैं और परिणाम लौटाते हैं। एग्रीगेशन परिणामों के आधार पर दस्तावेज़ अपडेट करने के लिए, एग्रीगेशन चलाएं, फिर प्रोग्रामेटिक रूप से updateOne/updateMany या bulkWrite का उपयोग करें।
उदाहरण: नेस्टेड विवरण वाला दस्तावेज़
> db.demo376.insertOne({
"id" : 101,
"details" : [
{ "Name":"Chris", "Age":21, "Score":45 },
{ "Name":"David", "Age":23, "Score":67 },
{ "Name":"Bob", "Age":20, "Score":54 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a71b92ae06a1609a00b0d") }
दस्तावेज़ देखना
> db.demo376.find().pretty();
अपडेट: arrayFilters के साथ शर्तों को पूरा करने वाले सरणी तत्वों के लिए Age बढ़ाएं
> db.demo376.update(
{ "id" : 101 },
{ $inc: { "details.$[d].Age": 3 } },
{ arrayFilters: [ { $and: [ { "d.Age": 21 }, { "d.Score": { $gt: 40 } } ] } ] }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
परिणाम जांचें
> db.demo376.find().pretty();
आउटपुट: Chris की Age अब 24 है; अन्य अपरिवर्तित।
व्याख्या
arrayFiltersशर्तों को परिभाषित करता है जो सरणी तत्व को अपडेट के लिए योग्य बनाते हैं।$[d]फ़िल्टर्ड स्थितीय ऑपरेटरarrayFiltersमेंdपहचानकर्ता से मेल खाने वाले प्रत्येक तत्व पर लागू होता है।- यह एग्रीगेशन के बिना घोषणात्मक सशर्त सरणी अपडेट की अनुमति देता है।
पैटर्न: एग्रीगेशन → अपडेट (एप्लिकेशन कोड में)
- मिलान करने वाले दस्तावेज़/तत्व खोजने के लिए एग्रीगेशन चलाएं।
- परिणामों पर पुनरावृत्त करें।
- प्रत्येक के लिए
updateOneजारी करें (याbulkWriteके लिए बैच)।
नोट
MongoDB 4.2+ updateMany के साथ एग्रीगेशन पाइपलाइन का समर्थन करता है (db.coll.updateMany(filter, [ { $set: { ... } } ])), लेकिन यह अभी भी $merge/$out के बिना मौजूदा संग्रह में लिख नहीं सकता।