3

试图在 mongodb 中获取一些数据(~500Mb)的 CSV 转储。思想流将是要走的路,以避免在内存中构建一个数组,然后立即构建 csv。

但是,mongoose 创建的流和 csv 期望的流似乎不是一回事。

 var stream = Subscriber.find().stream()                                                                                                   
 stream.setEncoding = function() { }                                                                                                       


 csv().from.stream(stream).on('record', function(record, index) {                                                                          
     console.log(record)                                                                                                                   
     console.log(index)                                                                                                                    
 })

如果没有setEncoding()上面的存根,当 csv 在流上调用 setEncoding 时,我会收到一个错误。有了它,结果

TypeError: Object #<Object> has no method 'indexOf'
    at [object Object].stringify   (/home/project/node_modules/csv/lib/stringifier.js:98:35)

那么,这甚至是正确的方法吗?如果是这样,流有什么问题?

4

3 回答 3

1

正如 zeMirco 所说:要获取集合的 CSV 转储,我会使用mongoexportMongoDB 附带的工具。以下是将数据库“mydatabase”中名为“users”的集合导出为 CSV 格式的示例:

$ mongoexport --csv --host localhost:27017 --db mydatabase --collection users --fields name,email,age -o output.csv

你会得到如下所示的东西:

$ cat output.csv
name,email,age
renold,renold.ronaldson@gmail.com,21
jacob,xXxjacobxXx@hotmail.com,16
于 2012-12-04T22:53:24.480 回答
0

如果您想通过访问 URL 并使用 express 从网络服务器下载 csv,您可以这样做:

var through = require('through');
var csv = require('csv')
var MyModel = require('./my_model');

app.get('/download_csv/', function(req, res) {

    res.setHeader('Content-disposition', 'attachment; filename=attendances.csv');
    res.contentType('csv');
    res.write('property 1,property 2\n');

    var modelStream = MyModel.find().stream();

    modelStream.
        pipe(through(write, end)).
        pipe(csv.stringify()).
        pipe(res);

    function end() {
        res.end();
        console.log('done outputting file');
    }

    function write(doc) {
        var myObject = doc.toObject({getters:true, virtuals:false});
        this.queue([
            myObject.property_1,
            myObject.property_2
        ]);
    }
});

注意:这是使用最新版本的 csv 模块(v0.4),而之前的答案使用的是旧版本的模块。

于 2015-01-08T14:09:31.780 回答
0

像这样的东西应该工作。替换process.stdout为文件流以将其写入文件。

var csv = require('csv')
var through = require('through')
var Model = require('...')
_ = require('underscore')

var modelStream = Model.find().stream();

modelStream.pipe(through(write, end)).pipe(csv()).pipe(process.stdout);

function end(){ console.log('done'); }
function write(doc) {
    this.queue(_.values(doc.toObject({getters:true, virtuals:false})));
}
于 2014-02-06T19:04:53.257 回答