आप उस दस्तावेज़ के मानों का उल्लेख नहीं कर सकते जिसे आप अद्यतन करना चाहते हैं, इसलिए दस्तावेज़ को पुनः प्राप्त करने के लिए आपको एक क्वेरी और इसे अद्यतन करने के लिए दूसरी क्वेरी की आवश्यकता होगी। ऐसा लगता है कि कोई सुविधा अनुरोध
है उसके लिए OPEN
. में 2016 से राज्य।
अगर आपके पास ऐसे दस्तावेज़ों का संग्रह है जो इस तरह दिखते हैं:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name" : "bar" }
MongoDB शेल का उपयोग करके, आप कुछ इस तरह कर सकते हैं:
db.test.find({ name: "bar" }).snapshot().forEach((doc) => {
doc.name = "foo-" + doc.name;
db.test.save(doc);
});
दस्तावेज़ को उम्मीद के मुताबिक अपडेट किया जाएगा:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name": "foo-bar" }
.snapshot()
पर ध्यान दें
call.यह सुनिश्चित करता है कि क्वेरी एक दस्तावेज़ को कई बार वापस नहीं करेगी क्योंकि दस्तावेज़ आकार में वृद्धि के कारण एक हस्तक्षेप लेखन ऑपरेशन इसे स्थानांतरित कर देता है।
इसे अपने Mongoose उदाहरण पर लागू करना, जैसा कि इस आधिकारिक उदाहरण में बताया गया है। :
Cat.findById(1, (err, cat) => {
if (err) return handleError(err);
cat.name = cat.name + "bar";
cat.save((err, updatedCat) => {
if (err) return handleError(err);
...
});
});
उल्लेखनीय है कि एक $concat
है
एग्रीगेशन फ्रेमवर्क में ऑपरेटर, लेकिन दुर्भाग्य से आप इसका उपयोग update
. में नहीं कर सकते क्वेरी।
वैसे भी, आपको जो करना है, उसके आधार पर आप उसका उपयोग $out
एकत्रीकरण के परिणामों को एक नए संग्रह में सहेजने के लिए ऑपरेटर।
उसी उदाहरण के साथ, आप करेंगे:
db.test.aggregate([{
$match: { name: "bar" }
}, {
$project: { name: { $concat: ["foo", "-", "$name"] }}
}, {
$out: "prefixedTest"
}]);
और एक नया संग्रह prefixedTest
इस तरह दिखने वाले दस्तावेज़ों के साथ बनाया जाएगा:
{ "_id" : ObjectId("XXX"), "name": "foo-bar" }
एक संदर्भ के रूप में, इसी विषय के बारे में एक और दिलचस्प प्रश्न है जिसमें कुछ उत्तर पढ़ने लायक हैं:किसी अन्य फ़ील्ड के मान का उपयोग करके MongoDB फ़ील्ड को अपडेट करें