Cara terbaik untuk melakukan ini adalah dalam versi 4.2+ yang memungkinkan penggunaan pipa agregasi dalam dokumen pembaruan dan updateOne, updateManyatau updatemetode pengumpulan. Perhatikan bahwa yang terakhir telah usang di sebagian besar jika tidak semua driver bahasa.
MongoDB 4.2+
Versi 4.2 juga memperkenalkan $setoperator tahap pipa yang merupakan alias untuk $addFields. Saya akan gunakan di $setsini karena memetakan dengan apa yang kita coba capai.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
MongoDB 3.4+
Dalam 3.4+ Anda dapat menggunakan $addFieldsdan $outoperator pipa agregasi.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Perhatikan bahwa ini tidak memperbarui koleksi Anda tetapi ganti koleksi yang ada atau buat yang baru. Juga untuk memperbarui operasi yang memerlukan "ketik casting" Anda akan memerlukan pemrosesan sisi klien, dan tergantung pada operasi, Anda mungkin perlu menggunakan find()metode ini daripada.aggreate() metode.
MongoDB 3.2 dan 3.0
Cara kami melakukan ini adalah dengan $projectmemasukkan dokumen kami dan menggunakan $concatoperator agregasi string untuk mengembalikan string yang digabungkan. we Dari sana, Anda lalu iterasi kursor dan gunakan $setoperator pembaruan untuk menambahkan bidang baru ke dokumen Anda menggunakan operasi massal untuk efisiensi maksimum.
Permintaan agregasi:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 atau lebih baru
dari ini, Anda perlu menggunakan bulkWritemetode ini.
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 perlu menggunakan BulkAPI yang sekarang sudah tidak digunakan lagi 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 } }
);
})