使用Mongoose在MongoDB上批量插入

时间:2018-04-25 17:37:17

标签: node.js mongodb express mongoose multer

我正在尝试将通过POST获得的CSV文件解析为JSON,然后将其上传到我的MongoDB数据库。 问题是我发现下一个脚本不是那么表现:它不是那么快,当我试图解析每个8.5MB(4~85'000行)的4个CSV时,它使用高达1.3GB的内存。

有人提出一些改进建议吗?

router.route('/upload').post(upload.single('data'), function (req, res) {
    fs.rename(UPLOAD_PATH+req.file.filename, UPLOAD_PATH+req.file.originalname, function(err){
    if (err) return res.status(500).send("Problem in POST\n");
    res.status(200).send("File registered\n");

    var arr = []; // TODO should fix: too much memory?

    csv().fromFile(UPLOAD_PATH+req.file.originalname)
        .on('json', (jsonObj)=>{
            arr.push(jsonObj);
        })
        .on('done', (error)=>{
            console.log('End of parsing, length: '+arr.length)
            Ping.insertMany(arr)
                .then(function(docs) {
                    console.log('Inserted everything on DB')
                    arr.length = 0;
                })
                .catch(function(err) {
                    // TODO
                });
        });
    });
});

EDIT1:使用mongoimport解析

router.route('/upload').post(upload.single('data'), function (req, res) {
fs.rename(UPLOAD_PATH+req.file.filename, UPLOAD_PATH+req.file.originalname, function(err){
    if (err) return res.status(500).send("Problem in POST\n");
    res.status(200).send("File registered\n");

    const { exec } = require('child_process'); // TODO secrets?
    exec('mongoimport -h host -d db -c pings -u user -p passwd --file '+UPLOAD_PATH+req.file.originalname+' --type csv --headerline', (err, stdout, stderr) => {
        if (err) {
            // TODO
            console.log('Error')
            return;
        }

    });
});
});

提前致谢:)

0 个答案:

没有答案