以下代码尝试从csv文件加载到在localhost上运行的mongodb实例。
问题 - 每次运行时加载不同数量的文档(总是少于csv中的记录总数)。
var csv = require('csv');
var server = new Server('localhost', 27017, {auto_reconnect: true, poolSize: 1});
var db = new Db('test', server);
db.open(function(err, db, onemore) {
if(!err) {
//Database connection is established.
db.collection('teststocks', function(err, collection) {
if(!err) {
// Stocks collection is connected, open the file and insert the doc
console.log("Trying to load from " + process.argv[2]);
csv()
.fromPath(process.argv[2], {
columns: true
})
.on('data', function(data, index) {
//data.stock = process.argv[2].substring(process.argv[2].lastIndexOf('/') + 1, process.argv[2].lastIndexOf('.'));
collection.insert(data, {safe: true}, function(error, collection){
if ( error ) { console.log("Error inserting record : " + error); }
});
console.log("Inserted data for " + index);
})
.on('error', function(error) {
db.close();
console.log("Error: " + error);
})
.on('end', function(count) {
console.log("Finished all writing.");
db.close();
});
}
});
}
});
P.S:我可以使用mongoimport实用程序加载数据,但是作为node.js和mongodb的新手;我想了解我在上面的代码中犯的错误。
答案 0 :(得分:2)
可能是因为您在csv()
完成阅读后关闭了数据库连接。但是,由于collection.insert
是异步的,因此无法保证每个调用在csv
完成并调用db.close()
之前完成。
一种选择是将csv
data
收集到Array
,然后将insert
全部收集到一起:
var docs = [];
csv()
// ...
.on('data', function (data, index) {
docs.push(data); // or possibly: docs[index] = data;
})
// ...
.on('end', function () {
console.log("Finished reading CSV.");
collection.insert(docs, { safe: true }, function (error, inserted) {
console.log("Finished all writing.");
db.close();
});
});