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

Bagaimana cara menyimpan 1 juta catatan ke mongodb secara tidak sinkron?

Itu meledak karena Anda tidak menunggu panggilan asinkron untuk diselesaikan sebelum melanjutkan ke iterasi berikutnya. Artinya, Anda sedang membangun "tumpukan" operasi yang belum terselesaikan sampai ini menyebabkan masalah. Apa nama situs ini lagi? Dapatkan gambarnya?

Jadi ini bukan cara terbaik untuk melanjutkan dengan "Bulk" sisipan. Untungnya driver MongoDB yang mendasarinya telah memikirkan hal ini, selain dari masalah panggilan balik yang disebutkan sebelumnya. Sebenarnya ada "Bulk API" tersedia untuk membuat ini jauh lebih baik. Dan dengan asumsi Anda sudah menarik driver asli sebagai db obyek. Tapi saya lebih suka menggunakan .collection pengakses dari model, dan "async" modul untuk memperjelas semuanya:

var bulk = Model.collection.initializeOrderedBulkOp();
var counter = 0;

async.whilst(
  // Iterator condition
  function() { return count < 1000000 },

  // Do this in the iterator
  function(callback) {
    counter++;
    var model = buildModel(counter);
    bulk.insert(model);

    if ( counter % 1000 == 0 ) {
      bulk.execute(function(err,result) {
        bulk = Model.collection.initializeOrderedBulkOp();
        callback(err);
      });
    } else {
      callback();
    }
  },

  // When all is done
  function(err) {
    if ( counter % 1000 != 0 ) 
        bulk.execute(function(err,result) {
           console.log( "inserted some more" );
        });        
    console.log( "I'm finished now" ;
  }
);

Perbedaannya adalah menggunakan kedua metode panggilan balik "asinkron" pada penyelesaian daripada hanya membangun tumpukan, tetapi juga menggunakan "API Operasi Massal" untuk mengurangi panggilan tulis asinkron dengan mengirimkan semuanya dalam pernyataan pembaruan batch dari 1000 entri.

Ini tidak hanya tidak "membangun setumpuk" eksekusi fungsi seperti kode contoh Anda sendiri, tetapi juga melakukan transaksi "kawat" yang efisien dengan tidak mengirimkan semuanya dalam pernyataan individual, melainkan memecah menjadi "batch" yang dapat dikelola untuk komitmen server .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB mengonversi tanggal menjadi string

  2. Dapatkan jumlah loglevel untuk setiap nama

  3. Basis Data NoSQL

  4. MongoDB $atan2

  5. Mongodb menjumlahkan ukuran bidang array