当我有一大堆对象时,如何将insertMany与Mongoose一起使用?

时间:2017-09-26 10:39:49

标签: mongoose promise

我正在尝试使用insertMany方法,但没有成功......我读了这个stackoverflow answer,但它没有说明如何处理非常大的对象数组。

在我的测试用例中,我有9755个对象,使用这个脚本它会导入所有行9次,这不是我想要的...

我希望每次导入时将数组分成1000个对象。

我该怎么做?

function bulkImportToMongo(arrayToImport, mongooseModel) {
  const Model = require(`../../../models/${mongooseModel}`);
  let counter = 0;
  let temp = [];
  arrayToImport.forEach(item => {
    temp.push(item);
    counter++;

    if (counter % 1000 == 0) {
      Model.insertMany(temp).then(mongoosedocs => {
        console.log(`imported ${counter} objects`);
        console.log(mongoosedocs.length);
        temp = [];
      });
    }
  });
}

1 个答案:

答案 0 :(得分:1)

您需要创建一个批次数组(每个批次不超过100个元素)。对于每个批次调用Model.insertMany。要等到所有文件都已插入,您Promise.all

function bulkImportToMongo(arrayToImport, mongooseModel) {
  const Model = require(`../../../models/${mongooseModel}`);
  const batchSize = 100;
  let batchCount = Math.ceil(arrayToImport.length / batchSize);
  let recordsLeft = arrayToImport.length;
  let ops = [];
  let counter = 0;
  for (let i = 0; i < batchCount; i++) {
    let batch = arrayToImport.slice(counter, counter + batchSize);
    counter += batchSize;
    ops.push(Model.insertMany(batch));
  }
  return Promise.all(ops);
}