使用mongoose在MongoDB中批量插入

jav*_*ice 11 javascript bulkinsert mongoose mongodb node.js

我目前在Mongodb有一个集合说"Collection1".我有以下需要插入MongoDB的对象数组.我正在使用Mongoose API.现在,我正在迭代数组并将它们中的每一个插入到mongo中.现在这没问题,但是当数据太大时会出现问题.我需要一种将数据批量插入MongoDB而无需重复的方法.我不知道该怎么做.我在Mongoose找不到批量选项.

我的代码如下

myData = [Obj1,Obj2,Obj3.......]

myData.forEach(function(ele){
      //console.log(ele)
     saveToMongo(ele);
    });
function saveToMongo(obj){
    (new Collection1(obj)).save(function (err, response) {
          if (err) {
             // console.log('Error while inserting: ' + obj.name + " " +err);
          } else {
            // console.log('Data successfully inserted');
          }
      });

      return Collection1(obj);
  }
Run Code Online (Sandbox Code Playgroud)

chr*_*dam 27

insertMany()如果你使用最新的Mongoose版本4.4.X和更高版本,你可能想在这里使用这个方法,它本质上是在幕后使用Model.collection.insertMany(),驱动程序可能会>= 1000为你处理并行化文档.

myData = [Obj1, Obj2, Obj3.......];
Collection1.insertMany(myData, function(error, docs) {});
Run Code Online (Sandbox Code Playgroud)

或使用Promises更好地处理错误

Collection1.insertMany(myData)
    .then(function(docs) {
         // do something with docs
    })
    .catch(function(err) {
        // error handling here
    });
Run Code Online (Sandbox Code Playgroud)

它的工作原理是创建一堆文档,.validate()并行调用它们,然后根据每个文档insertMany()的结果调用底层驱动程序toObject({ virtuals: false });.虽然insertMany()不会触发预保存挂钩,但它具有更好的性能,因为它只对服务器进行1次往返,而不是每个文档1次.


对于~3.8.8, ~3.8.22, 4.x支持MongoDB Server的Mongoose版本>=2.6.x,您可以使用Bulk API如下方法

var bulk = Collection1.collection.initializeOrderedBulkOp(),
    counter = 0;

myData.forEach(function(doc) {
    bulk.insert(doc);

    counter++;
    if (counter % 500 == 0) {
        bulk.execute(function(err, r) {
           // do something with the result
           bulk = Collection1.collection.initializeOrderedBulkOp();
           counter = 0;
        });
    }
});

// Catch any docs in the queue under or over the 500's
if (counter > 0) {
    bulk.execute(function(err,result) {
       // do something with the result here
    });
}
Run Code Online (Sandbox Code Playgroud)


小智 3

您可以将对象数组传递给 mongoose 模型创建函数

var Collection1 = mongoose.model('Collection1');

Collection1.create(myData,function(err){
    if(err) ...
});
Run Code Online (Sandbox Code Playgroud)