使用节点将多个大型JSON文件解析为mongoDB

时间:2018-04-10 08:57:40

标签: javascript json node.js parsing mongoose

我正在将多个大型JSON文件解析为我的mongoDB数据库。目前我正在使用stream-json npm包。加载一个文件后,我更改了我正在加载的文件名,然后重新启动脚本以加载下一个文件。这不必要地耗费时间。那么如何自动迭代所有文件呢?目前我的代码看起来像这样:

const StreamArray = require('stream-json/utils/StreamArray');
const path = require('path');
const fs = require('fs');

const filename = path.join(__dirname, './data/xa0.json'); //The next file is named xa1.json and so on.

const stream = StreamArray.make();

stream.output.on('data', function (object) {
    // my function block
});

stream.output.on('end', function () {
    console.log('File Complete');
});

fs.createReadStream(filename).pipe(stream.input);

我尝试通过添加一个循环来迭代文件的名称,这个循环会在脚本console.log('文件完成')的同一点添加+1到文件名,即xa0到xa1但是这不起作用。任何想法我怎么能够实现这个或类似的东西。

1 个答案:

答案 0 :(得分:1)

使用fs.readdir扫描您的JSON文件目录。它将返回一个您可以迭代的文件名列表,如下所示:

fs.readdir("./jsonfiles", async (err, files) => {
    for( file in files ){
      await saveToMongo("./jsonfiles/" + file)
    }
})

所以你只需启动一次脚本并等到完全完成。

当然,为了等待它,你需要宣传saveToMongo函数,例如:

const saveToMongo = fileName => {

    return new Promise( (resolve, reject) => {

        // ... logic here

        stream.output.on('end', function () {
            console.log('File Complete');
            resolve() // Will trigger the next await
        });
    })
}