我在Windows机器中有一个目录,有350万个json文件,范围从3到30kb。我有一些功能:
myBuilder(json){
//some stuff producing an object named entry
return entry
}
我想要做的就是读取目录中的每个文件,通过myBuilder运行它们并将它们全部插入到mongo数据库中。我在下面发布了我最好的尝试。
达到预期结果的最简单方法是什么?
注意:
示例代码:
var fs = require('fs');
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var MongoURL = 'mongodb://localhost:27017/my_database_name';
traverseFileSystem('/nodejs/nodetest1/imports');
function traverseFileSystem(path){
var files = fs.readdirSync(currentPath);
for (var i in files) {
var currentFile = path + '/' + files[i];
var stats = fs.statSync(currentFile);
if (stats.isFile()){
var fileText = fs.readFileSync(currentFile,'utf8');
var json= JSON.parse(fileText);
var entry = myBuilder(json); // note this is described above
insertToMongo(entry);
}
}
}
function insertToMongo(entry){
console.log(entry);
MongoClient.connect(MongoURL, function (err, db) {
var collection = db.collection('users');
collection.insert(entry, function (err, result) {
if(err)
console.log("error was"+err);
else
console.log("entry was"+result);
db.close();
});
});
}
这会将目录中每个文件的格式良好的条目传递(并记录到控制台)。但它不会显示任何条目的正面错误或结果。 Mongo确实显示已建立连接,并且不会显示任何错误。
答案 0 :(得分:0)
您可能希望为所有插入重用db连接。连接过程消耗一定量的ms。您可以保存,特别是如果您要导入大量文件。
关于一次插入一个或多个文档,您可以使用bulk operations。即通过使用循环,如:读取10个文件,“批量”-them并执行。也使用相同的数据库连接。
在这种情况下你可以考虑mongoimport:
您可以将终端中的mongoimport用于import all .json files within a directory:
@echo off
for %%f in (*.json) do (
"mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json
)