MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Perbarui bidang MongoDB menggunakan nilai bidang lain

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 } }
    );
})


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $setEquals

  2. Menginstal Klien/Driver PHP 7 MongoDB?

  3. tambahkan bidang create_at dan updated_at ke skema luwak

  4. Buat Indeks Teks dengan Bobot Bidang Berbeda di MongoDB

  5. Mencatat Kueri MongoDB dengan Spring Boot