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

MongoDB:Menyalin array ke array lain dalam dokumen yang sama

Untuk data yang relatif kecil, Anda dapat mencapai hal di atas dengan mengulangi koleksi menggunakan snapshot dengan forEach() kursor metode dan memperbarui setiap dokumen sebagai berikut:

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 
    db.wholesalers.updateOne(
        { "_id": doc._id },
        { "$set": { "brandsNetherlands": doc.brands } }
    );
});

Meskipun ini optimal untuk koleksi kecil, kinerja dengan koleksi besar sangat berkurang karena perulangan melalui kumpulan data besar dan mengirim setiap operasi pembaruan per permintaan ke server menimbulkan penalti komputasi.

Bulk() API datang untuk menyelamatkan dan sangat meningkatkan kinerja karena operasi tulis dikirim ke server hanya sekali secara massal. Efisiensi dicapai karena metode ini tidak mengirim setiap permintaan tulis ke server (seperti pernyataan pembaruan saat ini dalam forEach() loop) tetapi hanya sekali dalam setiap 1000 permintaan, sehingga membuat pembaruan lebih efisien dan lebih cepat daripada saat ini.

Menggunakan konsep yang sama di atas dengan forEach() loop untuk membuat batch, kita dapat memperbarui koleksi secara massal sebagai berikut.

Dalam demonstrasi ini Bulk() API tersedia dalam versi MongoDB >= 2.6 and < 3.2 menggunakan initializeUnorderedBulkOp() metode untuk mengeksekusi secara paralel, serta dalam urutan nondeterministik, operasi tulis dalam batch:

var massal =db.wholesalers.initializeUnorderedBulkOp(),penghitung =0; // counter untuk melacak ukuran pembaruan batch

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 

    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "brandsNetherlands": doc.brands } 
    });

    counter++; // increment counter
    if (counter % 1000 == 0) {
        bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
        bulk = db.wholesalers.initializeUnorderedBulkOp();
    }
});

Contoh berikutnya berlaku untuk versi MongoDB baru 3.2 yang sejak itu tidak lagi menggunakan Bulk() API dan menyediakan kumpulan api yang lebih baru menggunakan bulkWrite() .

Ini menggunakan kursor yang sama seperti di atas tetapi membuat array dengan operasi massal menggunakan forEach() metode kursor untuk mendorong setiap dokumen tulis massal ke array. Karena perintah tulis tidak dapat menerima lebih dari 1000 operasi, diperlukan operasi pengelompokan untuk memiliki paling banyak 1000 operasi dan menginisialisasi ulang array saat loop mencapai 1000 iterasi:

var cursor = db.wholesalers.find({
         "brands": { "$exists": true, "$type": 4 } 
    }),
    bulkUpdateOps = [];

cursor.snapshot().forEach(function(doc){ 
    bulkUpdateOps.push({ 
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { "$set": { "brandsNetherlands": doc.brands } }
         }
    });

    if (bulkUpdateOps.length === 1000) {
        db.wholesalers.bulkWrite(bulkUpdateOps);
        bulkUpdateOps = [];
    }
});         

if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menggunakan pengubah pembaruan $push di MongoDB dan C#, saat memperbarui array dalam dokumen

  2. Bagaimana cara menjalankan kueri asli MongoDB (JSON) hanya menggunakan driver mongo-java?

  3. Kesalahan Fatal - kelas 'Mongo' tidak ditemukan

  4. Kueri rekursif Mongodb tidak berfungsi seperti yang diharapkan dengan $graphLookup

  5. Apakah hasil kueri Mongoose hanya-baca?