ऐसा करने का सबसे अच्छा तरीका संस्करण 4.2+ है जो अपडेट दस्तावेज़ और updateOne, updateManyया updateसंग्रह विधि में एकत्रीकरण पाइपलाइन का उपयोग करने की अनुमति देता है । ध्यान दें कि बाद में सभी भाषाओं के चालकों को नहीं तो अधिकांश में पदावनत कर दिया गया है।
MongoDB 4.2+
संस्करण 4.2 ने $setपाइपलाइन चरण ऑपरेटर भी पेश किया, जो इसके लिए एक उपनाम है $addFields। मैं $setयहां उपयोग करूंगा क्योंकि यह उन मानचित्रों के साथ है जिन्हें हम हासिल करने की कोशिश कर रहे हैं।
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
MongoDB 3.4+
3.4+ में आप उपयोग कर सकते हैं $addFieldsऔर $outएकत्रीकरण पाइपलाइन ऑपरेटर।
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
ध्यान दें कि यह आपके संग्रह को अपडेट नहीं करता है, बल्कि मौजूदा संग्रह को प्रतिस्थापित करता है या एक नया बनाता है। इसके अलावा अद्यतन कार्यों के लिए जिन्हें "टाइप कास्टिंग" की आवश्यकता होती है, आपको क्लाइंट साइड प्रोसेसिंग की आवश्यकता होगी, और ऑपरेशन के आधार पर, आपको find()विधि के बजाय विधि का उपयोग करने की आवश्यकता हो सकती है .aggreate()।
MongoDB 3.2 और 3.0
जिस तरह से हम ऐसा करते हैं वह $projectहमारे दस्तावेज़ों द्वारा किया जाता है और $concatसमवर्ती स्ट्रिंग को वापस करने के लिए स्ट्रिंग एकत्रीकरण ऑपरेटर का उपयोग करता है । हम वहां से, फिर आप कर्सर को पुनरावृत्त करते हैं और अधिकतम दक्षता के लिए बल्क ऑपरेशंस$set का उपयोग करके अपने दस्तावेज़ों में नया फ़ील्ड जोड़ने के लिए अपडेट ऑपरेटर का उपयोग करते हैं ।
एकत्रीकरण क्वेरी:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 या नया
इस से, आपको bulkWriteविधि का उपयोग करने की आवश्यकता है ।
var requests = [];
cursor.forEach(document => {
requests.push( {
'updateOne': {
'filter': { '_id': document._id },
'update': { '$set': { 'name': document.name } }
}
});
if (requests.length === 500) {
//Execute per 500 operations and re-init
db.collection.bulkWrite(requests);
requests = [];
}
});
if(requests.length > 0) {
db.collection.bulkWrite(requests);
}
MongoDB 2.6 और 3.0
इस संस्करण से आपको अब अपग्रेड किए गए Bulkएपीआई और उससे जुड़े तरीकों का उपयोग करने की आवश्यकता है ।
var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;
cursor.snapshot().forEach(function(document) {
bulk.find({ '_id': document._id }).updateOne( {
'$set': { 'name': document.name }
});
count++;
if(count%500 === 0) {
// Excecute per 500 operations and re-init
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// clean up queues
if(count > 0) {
bulk.execute();
}
MongoDB 2.4
cursor["result"].forEach(function(document) {
db.collection.update(
{ "_id": document._id },
{ "$set": { "name": document.name } }
);
})