1

我已经尝试过使用名为 json2csv 的 npm 包。对于最多 75 000 条记录,它工作正常。当数据超过该数据时,我没有从回调函数 exporttocsv 得到任何响应,如下所示。

    const json2csv = require('json2csv').parse;
    var today = new Date();
var mongoClient = require('mongodb').MongoClient
, assert = require('assert');
    var dd = today.getDate();
    var mm = today.getMonth() + 1; //January is 0!
    var yyyy = today.getFullYear();
    if (dd < 10) {
      dd = '0' + dd;
    } 
    if (mm < 10) {
      mm = '0' + mm;
    } 
    var today = dd + '_' + mm + '_' + yyyy;



    router.put('/mass_report', (req, res) => {

        mass_data_download();
        res.json("Mass report download initiated");

    });

    function exporttocsv(data,name, callback) {
        /* Start: Json to xlsx conversion */
        if (!fs.existsSync('./csv/'+today+'/')) {
            fs.mkdirSync('./csv/'+today+'/');
        }

        var csv = json2csv(data);

        var fname = './csv/'+today+'/' +name+ new Date().getTime() + '.csv';
        fs.writeFileSync(fname, csv, 'binary',(error,response)=>{
            console.log(error);
            console.log(response);
        });
        callback(fname);

    }

    function mass_data_download(){


        db.collection('mass_data').aggregate([
            {$match:{
                created_on: {
                    $gte: new Date("2017-09-01T00:00:00.000Z"),
                }
            }}

        ]).sort({_id:-1}).toArray( function (error, response) {
        if(error){
            console.log(error)
        }
        else{
            console.log(response.length);
            exporttocsv(response,'mass_report', function (fname) {

                console.log('reports download complted');



            })

        }

            })
    }

将数据导出到 csv 时是否有任何限制?或者如何通过任何其他替代方案来实现这一目标?

4

1 回答 1

0

问题是您同时在内存中处理大量数据。你应该不惜一切代价避免它。Node.js 非常适合使用流,搭载它。将Mongo视为您的可读流,然后将其通过管道传输到json2csv转换流并对结果执行您想要的操作,也许您希望将其传输到可写流,例如文件甚至 http 响应。

Mongoose 支持流式传输。您可以在此处找到更多信息 json2csv 还支持流接口。是有关 json2csv 的流 API 的更多信息。

更新:最终伪代码应如下所示:

const csv = fs.createWriteStream('file.csv');

Model.find()
    .cursor()  // read more [here][1] 
    .pipe(json2csvTransformStream) // read more in json2csv transform stream API
    .pipe(csv); // read more in fs.createWritableStream

管道将处理所有流,您不必担心内存泄漏或性能。

于 2019-02-27T09:00:33.683 回答