关闭节点中的MongoDB连接.js同时插入大量数据
closing mongodb connection in node.js while inserting lot of data
我正在尝试编写一个程序来解析并将 IIS 日志数据插入到 mongodb。文件不是那么大,大约有 600 行。与.net和sql服务器:)相比,试图说服我的管理nodejs和mongodb对此更好。
看看下面的 nodejs 代码。逻辑:我解析每一行并转换为 json 并将保存插入 db。我正在使用蒙古本地驱动程序。
问题:即使在所有线路插入 DB 之前,数据库连接也会关闭。
我看到日志文件有 6000 行,但 db 中的记录数只有 arnd 4000。我知道这是nodejs的异步特性,在这种情况下,我如何以更确定的方式关闭连接(在检查是否插入所有行之后)?
var MongoClient = require('mongodb').MongoClient;
var mongoServer = require('mongodb').Server;
var serverOptions = {
'auto_reconnect': true,
'poolSize': 5
};
var fs = require('fs');
var readline = require('readline');
var rd = readline.createInterface({
input: fs.createReadStream('C:/logs/Advisor_Metrics/UI/P20VMADVSRUI01/u_ex130904.log'),
output: process.stdout,
terminal: false
});
var mongoClient = new MongoClient(new mongoServer('localhost', 27017, serverOptions));
var db = mongoClient.db('test');
var collection = db.collection('new_file_test');
var cntr = 0;
mongoClient.open(function (err, mongoClient) {
console.log(err);
if (mongoClient)
{
rd.on('line', function (line) {
if (line.indexOf('#') == -1) {
var lineSplit = line.split(' ');
var data =
{
d: lineSplit[0],
t: lineSplit[1],
sip: lineSplit[2],
met: lineSplit[3],
uri: lineSplit[4],
cip: lineSplit[8],
cua: lineSplit[9],
stat: lineSplit[10],
tt: lineSplit[13]
};
collection.insert(data, function (err, docs) {
console.log('closing connection');
//db.close();
});
}
});
}
})
rd.on('close', function () {
db.close();
});
Sol 1 :一个解决方案是解析 json 对象并添加到数组中并将数组添加到 mongodb。 我不想这样做,因为这需要将整个巨大的日志文件解析到内存中! 还有其他解决方案吗?
我 100% 确定,但据我所知,您正在同步插入数据。我的意思是,一旦你得到一行,你就会尝试插入它,不要等待结果。尝试使用另一种方法:
- 读取所有行并将它们存储在数组中
- 开始逐行异步插入数据
像这样:
var lines = [];
var readAllLines = function(callback) {
// store every line inside lines array
// and call the callback at the end
callback();
}
var storeInDb = function(callback) {
if(lines.length === 0) {
callback();
return;
}
var line = lines.shift();
collection.insert(line, function (err, docs) {
storeInDb(callback);
});
}
mongoClient.open(function (err, mongoClient) {
console.log(err);
if (mongoClient) {
readAllLines(function() {
storeInDb(function() {
// lines are inserted
// close the db connection
})
});
}
});
相关文章:
- 通过mongos和javascript插入数据
- HTML5/JavaScript.使用索引数据库时无法插入数据
- 在数据库中插入数据后,无法重定向到 HTML 页面
- 通过 Yii2 表单插入数据时获取空值
- 如何在for循环中的新对象中插入数据
- 如何在HTML中用两个预定义的值绑定选择选项,以在mongodb中插入数据
- jQueryAjax:从php插入数据
- 插入数据并用新数据刷新数据网格后,关闭弹出窗口
- 在用户为下一次输入插入数据后清空文本字段
- 在 jaydata 中的循环中插入数据
- 如何在node.js应用程序中的mongodb中按层次结构顺序插入数据
- 如何在表单输入元素内的数组中插入数据
- 使用 Prepare 语句插入数据不会返回插入的记录
- 如何在编码器中使用具有相同名称的多个输入插入数据
- 将字段与 id 匹配并插入数据 - 流星
- 如何使用javascript或jquery创建tr的克隆并在新行中插入数据
- 在代码点火器上使用 ajax 插入数据
- 如何插入数据 PHP JavaScript MySQL 与多个数组
- 从gsheet向bigquery插入数据
- I'm使用angularjs路线.在日志页面中插入数据后,我希望它在导航到日志列表页面时自动更新