sql >> データベース >  >> NoSQL >> Redis

その場で生成される非常に大きなファイルをクライアントにダウンロードさせる方法

    Excelエクスポート:

    ストリームを使用します。以下は、何が行われる可能性があるかについての大まかな考えです。

    1. exceljsモジュールを使用します。この正確な問題を対象としたストリーミングAPIがあるためです。

      var Excel = require('exceljs')
      
    2. ダウンロードを開始しようとしているので。応答に適切なヘッダーを書き込みます。

      res.status(200);
      res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
      res.setHeader('Content-type', 'application/vnd.ms-excel');
      
    3. StreamingExcelライターに裏打ちされたワークブックを作成します。ライターに与えられるストリームはサーバーの応答です。

      var options = {
          stream: res, // write to server response
          useStyles: false,
          useSharedStrings: false
      };
      
      var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
      
    4. これで、出力ストリーミングフローがすべて設定されました。入力ストリーミングには、クエリ結果/カーソルをストリームとして提供するDBドライバーをお勧めします。

    5. 1つのテーブルを1つのワークシートにダンプする非同期関数を定義します。

      var tableToSheet = function (name, done) {
          var str = dbDriver.query('SELECT * FROM ' + name).stream();
          var sheet = workbook.addWorksheet(name);
      
          str.on('data', function (d) {
              sheet.addRow(d).commit(); // format object if required
          });
      
          str.on('end', function () {
              sheet.commit();
              done();
          });
      
          str.on('error', function (err) {
              done(err);
          });
      }
      
    6. 次に、非同期モジュールのmapSeriesを使用していくつかのdbテーブルをエクスポートしましょう:

      async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){
         if(err){
           // log error
         }
         res.end();
      })
      

    CSVエクスポート:

    単一のテーブル/コレクションモジュールのCSVエクスポートには、fast-csvを使用できます:

    // response headers as usual
    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv');
    res.setHeader('Content-type', 'text/csv');
    
    // create csv stream
    var csv = require('fast-csv');
    var csvStr = csv.createWriteStream({headers: true});
    
    // open database stream
    var dbStr = dbDriver.query('SELECT * from mytable').stream();
    
    // connect the streams
    dbStr.pipe(csvStr).pipe(res);
    

    これで、データをDBからHTTP応答にストリーミングし、その場でxls/csv形式に変換します。データ全体をメモリまたはファイルにバッファリングまたは保存する必要はありません。



    1. MongoDB $ mergeObjects

    2. ボタンクリックでメテオページを更新

    3. Mongoose/MongoDBの結果フィールドがJavascriptで未定義で表示される

    4. タイムアウトせずにmongoid/railsを使用してmongodbにクエリを実行するにはどうすればよいですか?