Cara terbaik untuk melakukan ini adalah dalam versi 4.2+ yang memungkinkan penggunaan pipa agregasi dalam dokumen pembaruan dan updateOne
, updateMany
atau update
metode pengumpulan. Perhatikan bahwa yang terakhir telah usang 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 gunakan di $set
sini 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 $addFields
dan $out
operator 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 $project
memasukkan dokumen kami dan menggunakan $concat
operator agregasi string untuk mengembalikan string yang digabungkan. we Dari sana, Anda lalu iterasi kursor dan gunakan $set
operator 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 bulkWrite
metode 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 Bulk
API 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 } }
);
})