Bunu yapmanın en iyi yolu, güncelleme belgesinde ve updateOne
, updateMany
veya update
toplama 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 $set
bir takma ad olan boru hattı sahne operatörü tanıttı $addFields
. Ben kullanacağı $set
o 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 $addFields
ve $out
toplama 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 $concat
birleştirilmiş dizeyi döndürmek için dize toplama operatörünü kullanmaktır . Oradan, daha sonra yineleme imleci ve kullanımı $set
kullanarak 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, bulkWrite
yö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ış Bulk
API'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 } }
);
})