【问题标题】:Parsing multiple large JSON files with node to mongoDB使用节点解析多个大型 JSON 文件到 mongoDB
【发布时间】:2018-09-19 19:48:11
【问题描述】:

我正在将多个大型 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);

我尝试通过添加一个循环来迭代文件名.任何想法我如何能够实现这一目标或类似的东西。

【问题讨论】:

    标签: javascript json node.js parsing mongoose


    【解决方案1】:

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

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

    因此,您只需启动一次脚本并等待完全完成。

    当然,为了等待它,你需要promisify 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
            });
        })
    }
    

    【讨论】:

    • 感谢您的帮助。虽然它在没有任何问题的情况下遍历文件名,但 saveToMongo 块中的流没有启动/执行。因此,所有文件名都可以在一秒钟内简单地迭代。在 saveToMongo 功能块中,我得到了与上面示例中从 const stream = 向下相同的代码。我也知道fs.readCreateReadStream 中的文件名在块中可用,并且与添加迭代器之前相同。任何想法为什么流没有执行?非常感谢您的帮助
    • 是的,我已经修改了我的答案并添加了有关 Promises 的内容
    • 谢谢@Jeremy Thille!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多