使用 mongoose 在 MongoDB 中批量插入

Posted

技术标签:

【中文标题】使用 mongoose 在 MongoDB 中批量插入【英文标题】:Bulk insert in MongoDB using mongoose 【发布时间】: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);
  

【问题讨论】:

【参考方案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) ...
);

【讨论】:

以上是关于使用 mongoose 在 MongoDB 中批量插入的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以使用 mongoose 从 mongodb 批量操作中获取修改后的 IDS?

Mongoose (mongodb) 批量插入、删除、更新和无操作

mongoose 批量操作

Mongoose 批量插入子类别

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录

猫鼬批量插入错误