【问题标题】:Bulk insert in MongoDB using mongoose使用 mongoose 在 MongoDB 中批量插入
【发布时间】:2016-09-19 15:17:06
【问题描述】:

我目前在 Mongodb 中有一个集合说“Collection1”。 我有以下需要插入 MongoDB 的对象数组。我正在使用猫鼬 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);
  }

【问题讨论】:

    标签: javascript node.js mongodb mongoose bulkinsert


    【解决方案1】:

    如果您使用最新的 Mongoose 版本 4.4.X 及更高版本,您可能希望在此处使用 insertMany() 方法,该方法实质上使用 Model.collection.insertMany() 下引擎盖和驱动程序可能会为您处理并行化 >= 1000 文档。

    myData = [Obj1, Obj2, Obj3.......];
    Collection1.insertMany(myData, function(error, docs) {});
    

    或使用 Promises 更好地处理错误

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

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


    对于支持 MongoDB Server >=2.6.x 的 Mongoose 版本 ~3.8.8, ~3.8.22, 4.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
        });
    }
    

    【讨论】:

    • 嗨,我正在尝试使用 bulk mongoose 添加大量数据(我有 409 584 个数据要添加),但我只添加了 273001 个数据。你知道为什么吗?
    • 您的 MongoDB 服务器版本是多少?
    • 我有 MongoDB 版本 3.2.9 和猫鼬 4.7.2。如果我使用 insertMany 我得到FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 然后我尝试使用批量方法。
    • 我们可以保留他们创建的顺序吗
    【解决方案2】:

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

    var Collection1 = mongoose.model('Collection1');
    
    Collection1.create(myData,function(err){
        if(err) ...
    });
    

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2018-03-24
      • 2016-11-04
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2013-11-07
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多