Bunu yapmanın en iyi yolu, güncelleme belgesinde ve updateOne, updateManyveya updatetoplama yönteminde toplama boru hattının kullanılmasına izin veren 4.2 ve sonraki sürümlerdir . İkincisinin, tüm dil sürücüleri olmasa da çoğunda kullanımdan kaldırıldığını unutmayın.
MongoDB 4.2+
Sürüm 4.2 ayrıca $setbir takma ad olan boru hattı sahne operatörü tanıttı $addFields. Ben kullanacağı $seto kadar burada eşler biz başarmak için çalışıyoruz ne.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
MongoDB 3.4+
3.4+ sürümünde $addFieldsve $outtoplama boru hattı operatörlerini kullanabilirsiniz.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Bu unutmayın koleksiyonunuzu güncellemek yerine varolan koleksiyon değiştirmek veya yeni bir tane oluşturmaz. Ayrıca "tür döküm" gerektiren güncelleme işlemleri için istemci tarafı işlemeye ihtiyacınız olacak ve işleme bağlı olarak, find()yöntem yerine yöntemi kullanmanız gerekebilir .aggreate().
MongoDB 3.2 ve 3.0
Bunu yapma şeklimiz $project, belgelerimizi oluşturarak ve $concatbirleştirilmiş dizeyi döndürmek için dize toplama operatörünü kullanmaktır . Oradan, daha sonra yineleme imleci ve kullanımı $setkullanarak belgelere yeni alan eklemek için güncelleme operatörü toplu işlemler maksimum verim için.
Toplama sorgusu:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 veya daha yenisi
bundan, bulkWriteyöntemi kullanmanız gerekir .
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 ve 3.0
Bu sürümden, artık kullanımdan kaldırılmış BulkAPI'yı ve onunla ilişkili yöntemleri kullanmanız gerekir .
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 } }
);
})