node.js - 如何使用 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"
}]
解决方案
您可以使用 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);
});
}
});
推荐阅读
- aws-lambda - 如何在 CloudFormation 中设置集群创建者以在 lambda 中重用它?
- arrays - 分配数组会使内存比声明可分配的更易于管理吗?
- html - 使用 dart 从 html 表中提取数据
- asp.net - 需要帮助编辑 asp.net 中的下拉列表
- java - hibernate:制作一个允许用户将标题、描述和图像存储到数据库中的 API
- c# - 如何在 c# 框架 4.7 的 Windows 窗体 DataGridView 控件中禁用默认键盘处理
- java - ByteBuddy 从创建的类创建类
- php - 将 excel 导入数据库时出现 504 超时错误(Laravel)
- python - Python 需求与 PyPi 冲突
- c# - 使用 .net c# 将图像从 jpg 转换为特定的 TIFF 格式