Cara terbaik untuk melakukannya adalah di versi 4.2+ yang memungkinkan penggunaan pipa agregasi di pembaruan dokumen dan updateOne
, updateMany
atau update
metode pengumpulan. Perhatikan bahwa yang terakhir telah ditinggalkan di sebagian besar jika tidak semua driver bahasa.
MongoDB 4.2+
Versi 4.2 juga memperkenalkan $set
operator tahap pipa yang merupakan alias untuk $addFields
. Saya akan menggunakan $set
di sini karena peta dengan apa yang ingin kita capai.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
Perhatikan bahwa tanda kurung siku dalam argumen kedua untuk metode yang mendefinisikan pipa agregasi alih-alih dokumen pembaruan biasa. Menggunakan dokumen biasa tidak bekerja dengan benar.
MongoDB 3.4+
Di 3.4+ Anda dapat menggunakan $addFields
dan $out
operator pipeline agregasi.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Perhatikan bahwa ini tidak memperbarui koleksi Anda, melainkan menggantikan koleksi yang ada atau membuat yang baru. Juga untuk operasi pembaruan yang memerlukan "typecasting", Anda akan memerlukan pemrosesan sisi klien, dan tergantung pada operasinya, Anda mungkin perlu menggunakan find()
metode alih-alih .aggreate()
metode.
MongoDB 3.2 dan 3.0
Cara kami melakukannya adalah dengan $project
ing dokumen kami dan menggunakan $concat
operator agregasi string untuk mengembalikan string yang digabungkan. Dari sana, Anda kemudian mengulangi kursor dan gunakan $set
perbarui operator untuk menambahkan bidang baru ke dokumen Anda menggunakan operasi massal untuk efisiensi maksimum.
Kueri agregasi:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 atau yang lebih baru
dari sini, Anda perlu menggunakan bulkWrite
metode.
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 dan 3.0
Dari versi ini, Anda harus menggunakan Bulk
. yang sekarang sudah tidak digunakan lagi API dan metode terkaitnya.
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 } }
);
})