ऐसा करने का सबसे अच्छा तरीका संस्करण 4.2+ में है जो अपडेट में एकत्रीकरण पाइपलाइन का उपयोग करने की अनुमति देता है दस्तावेज़ और updateOne
, updateMany
या update
संग्रह के तरीके। ध्यान दें कि बाद वाले को सभी भाषाओं के ड्राइवरों के लिए नहीं तो अधिकांश में पदावनत कर दिया गया है।
मोंगोडीबी 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 } }
);
})