从nodejs在mongodb中插入一大块对象

时间:2014-05-29 07:41:29

标签: node.js mongodb bigdata

我需要从nodejs在mongodb中插入一大堆对象(大约1.5-2百万)。我怎样才能改善插入?

这是我的代码:

var sizeOfArray = arrayOfObjects.length; //sizeOfArray about 1.5-2 millions
for(var i = 0; i < sizeOfResult; ++i) {
  newKey = {
    field_1: result[i][1],
    field_2: result[i][2],
    field_3: result[i][3]
  };
  collection.insert(newKey, function(err, data) {
    if (err) {
      log.error('Error insert: ' + err);
    }
  });
}

2 个答案:

答案 0 :(得分:16)

您可以使用bulk插页。

有两种类型的批量操作:

  
      
  1. 订购批量操作。这些操作按顺序执行所有操作,并在第一次写入错误时执行错误。
  2.   
  3. 无序批量操作。这些操作并行执行所有操作并聚合所有错误。无序   批量操作不保证执行顺序。
  4.   

所以你可以这样做:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://myserver:27017/test", function(err, db) {
    // Get the collection
    var col = db.collection('myColl');

    // Initialize the Ordered Batch
    // You can use initializeUnorderedBulkOp to initialize Unordered Batch
    var batch = col.initializeOrderedBulkOp();

    for (var i = 0; i < sizeOfResult; ++i) {
      var newKey = {
          field_1: result[i][1],
          field_2: result[i][2],
          field_3: result[i][3]
      };
      batch.insert(newKey);
    }

    // Execute the operations
    batch.execute(function(err, result) {
      console.dir(err);
      console.dir(result);
      db.close();
    });
});

答案 1 :(得分:1)

对于版本> 3.2,引入了 insertMany ,其在引擎盖下使用 bulkWrite 仅用于批量插入。

  • 插入许多支持有序无序插入。 无序是mongo决定排序的更快方法。同样,实现最佳吞吐量的实现应为::

       var sizeOfArray = arrayOfObjects.length;
       for(var i = 0; i < sizeOfResult; ++i) {
         newKey = {
          field_1: result[i][1],
          field_2: result[i][2],
          field_3: result[i][3]
         };
       }
       collection.insertMany(newKey, { ordered: false }).then((res) => {
       console.log("Number of records inserted: " + res.insertedCount);
       })