【问题标题】:How to download Collection of Mongo from NodeJS如何从 NodeJS 下载 Mongo 集合
【发布时间】:2018-01-15 15:48:46
【问题描述】:

我有 Mongo 数据库,我想使用 NodeJs API 下载一个集合的所有寄存器。我想像 CSV 或类似的东西下载。目前我的收藏有 501426 寄存器,所以当我调用 .find() 方法时,它会返回此错误:

<--- Last few GCs --->
[15092:000001FE5E775B70]    95966 ms: Mark-sweep 1407.6 (1467.7) -> 1407.5 
(1451.2) MB, 1408.9 / 0.0 ms  last resort GC in old space requested
[15092:000001FE5E775B70]    97421 ms: Mark-sweep 1407.5 (1451.2) -> 1407.5 
(1451.2) MB, 1454.2 / 0.0 ms  last resort GC in old space requested
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 000003F5F89A5EE1 <JSObject>
2: GetHash(aka GetHash) [native collection.js:1] [bytecode=000003F5F89D1721 
offset=51](this=0000011364082311 <undefined>,o=000002F6E28FAE89 <JSFunction 
wrapper (sfi = 000003167E337821)>)
4: set [native weak-collection.js:1] [bytecode=000003167E3380F9 offset=50]
(this=000001DB08591699 <JSWeakMap>,key=000002F6E28FAE89 <JSFunction wrapper 
(sfi = 000003167E337821)>,value=00000021B54F67F9 <J...
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

我的代码是这样的:

Collection.find({}).then(function(logs) {
  res.charset = 'utf-8';
          res.setHeader('Content-disposition', 'attachment; filename=' + 'filename.csv');
          res.setHeader('content-type', 'text/csv');
          csv
            .write(logs, {
              headers: true,
              transform: function(row) {
                return {
                  'Nivel': row.level,
                  'Metodo': row.method,
                  'IP': row.ip,
                  'URL': row.url,
                  'Status Code': row['status-code'],
                  'Usuario': row.user_email.email,
                  'Fecha': row.createdAt,
                  'Cuerpo': row.req_body,
                  'Consulta': row.req_query,
                  'Navegador': row['user-agent'],
                  'Datos Usuario': row.user_email,
                  'Aplicacion': row.referrer
                };
              }
            })
            .pipe(res);
})

此代码有效,但我想下载 Collection 的所有文档。对不起我的英语。

谢谢

【问题讨论】:

  • 在 mongoDB 中没有真正的“模型”。它本质上是动态的。您是在谈论“集合”中的“文档”吗?请出示您的代码,这将有很大帮助;)
  • 谢谢@JonasW。对不起我的问题!我改了
  • 好的,下一个问题:csv 指的是哪个库?
  • @JonasW。它是 csv = require('fast-csv'); :)

标签: javascript node.js mongodb download


【解决方案1】:

与其一次性转换/解析内存,不如一个接一个地处理。为此,我们首先需要一个 Stream,我们可以将数据写入:

 var csvStream = csv.createWriteStream({headers: true}),
csvStream.pipe(res); // directly pipe it to the user

然后我们可以逐个文档读取集合文档,并将其通过管道传输到 csv Transformer:

 Collection.find({}).stream({
    transform(row){
      return {
              'Nivel': row.level,
              'Metodo': row.method,
              'IP': row.ip,
              'URL': row.url,
              'Status Code': row['status-code'],
              'Usuario': row.user_email.email,
              'Fecha': row.createdAt,
              'Cuerpo': row.req_body,
              'Consulta': row.req_query,
              'Navegador': row['user-agent'],
              'Datos Usuario': row.user_email,
              'Aplicacion': row.referrer
            };
    }
  }).pipe(csvStream);

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 2013-07-22
    • 2014-10-17
    • 1970-01-01
    • 2017-10-25
    • 2020-07-22
    • 2018-05-04
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多