簡體   English   中英

如何從mongodb中使用nodejs以csv格式下載超過50萬條記錄的整個集合?

[英]How to download whole collection with more than 500k records as csv with nodejs from mongodb?

我已經使用名為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時有什么限制嗎? 或如何通過其他替代方式實現這一目標?

問題是您正在同時處理內存中的大量數據。 您應該不惜一切代價避免使用它。 Node.js非常適合使用流,搭載在其上。 Mongo視為您的可讀流,然后將其通過管道傳輸到json2csv轉換流,然后對結果進行所需的操作,也許您希望將其通過管道傳輸到可寫流,例如文件甚至http響應。

貓鼬支持流媒體。 您可以在這里找到更多信息json2csv還支持流接口。 這里是有關json2csv流API的更多信息。

UPDATED :最終偽代碼應類似於:

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

管道將處理所有流,並且您不必擔心內存泄漏或性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM