首页 > 解决方案 > 如何使用 NodeJS 在 MongoDB 中使用批处理插入数百万个文档

问题描述

我已经编写了 nodejs 脚本来读取 JSON 文件并将多条记录插入到 mongo 集合中,我有数百万条记录,我不想在短时间内插入所有文档。我想每秒插入 300 个文档并休眠 30 秒,然后再插入 300 个等等?我是 NodeJS 的新手-请问如何使用下面的代码实现这一点?感谢您的帮助和支持。

应用程序.js

const mongoClient = require("mongodb").MongoClient;
const util = require('util');
const fs = require('fs');

let database = null;
new mongoClient('mongodb://localhost:3000/', {
    auth: {
        user: 'admin',
        password: 'password',
    }
}).connect(
    (err, db) => {
        if (err) return console.error(err);
        database = db.db('myDB');
        fs.readFile('data.json', 'utf8', function(err, data) {
            if (err) throw err;
            var json = JSON.parse(data);
            database.collection("test").insertMany(json, function(err, doc) {
                console.log("Documents inserting");
                if (err) throw err;
            });
            //db.close();
        });
    });

示例数据: - 我在一个文件中有数百万条这样的记录。

 [{
    "firstName": "Ariel",
    "lastName": "Bailey"
 }, {
    "firstName": "Lura",
    "lastName": "Buckridge"
 }, {
    "firstName": "Milton",
    "lastName": "Macejkovic"
 }, {
    "firstName": "Carolyn",
    "lastName": "Hegmann"
 }, {
    "firstName": "Sid",
    "lastName": "Beer"
 }]

标签: node.jsmongodb

解决方案


您可以使用 setTimeout 像这样“批量”插入:

fs.readFile('data.json', 'utf8', function (err, data) {
  if (err) throw err;
  var json = JSON.parse(data);
  processRecords(0, 300, 30 * 1000);

  function processRecords(startIdx, n, delay) {
    if (startIdx >= json.length) return db.close();

    database.collection("test").insertMany(json.slice(startIdx, startIdx + n), function (err, doc) {
      if (err) throw err;

      setTimeout(() => processRecords(startIdx + n, n, delay), delay);
    });
  }
});

推荐阅读