MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да запишете 1 милион записа в mongodb асинхронно?

Избухна, защото не чакате асинхронно повикване да завърши, преди да преминете към следващата итерация. Това означава, че изграждате "стек" от неразрешени операции, докато това не причини проблем. Как се казва пак този сайт? Разбра ли снимката?

Така че това не е най-добрият начин да продължите с "Групово" вмъквания. За щастие основният драйвер на MongoDB вече е помислил за това, освен проблема с обратното извикване, споменат по-рано. Всъщност има "Bulk API" на разположение, за да направи това много по-добро. И ако приемем, че вече сте изтеглили родния драйвер като db обект. Но предпочитам просто да използвам .collection инструмент за достъп от модела и "async" модул, за да стане всичко ясно:

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

Разликата там е използването на двата метода за обратно извикване на „асинхронно“ при завършване, вместо просто изграждане на стек, но също така и използване на „API за масови операции“, за да се смекчат асинхронните извиквания за запис чрез подаване на всичко в изявления за пакетно актуализиране от 1000 записа.

Това не само не „изгражда стек“ от изпълнение на функции като вашия собствен примерен код, но също така извършва ефективни „жични“ транзакции, като не изпраща всичко в отделни изрази, а по-скоро се разбива на управляеми „партиди“ за ангажиране на сървъра .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да ограничите изтриването в MongoDB за събиране на връзки

  2. Как да сериализирам ObjectId в JSON?

  3. Как да настроите отделна база данни за тестване и разработка в meteor

  4. Грешка при създаване на bean с име 'personRepository':Неуспешно извикване на init метод; вложеното изключение е com.mongodb.util.JSONParseException:

  5. Проблем с MapReduce