通过mongoose流导出到node-csv

时间:2012-12-02 17:38:53

标签: node.js mongoose

尝试在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)

那么,这是否是正确的方法?如果是这样,流的问题是什么?

3 个答案:

答案 0 :(得分:1)

正如zeMirco所说:要获得集合的CSV转储,我将使用MongoDB附带的mongoexport工具。以下是将数据库“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

答案 1 :(得分: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})));
}

答案 2 :(得分:0)

如果您想通过访问网址和使用快递从网络服务器下载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),而之前的答案是使用旧版本的模块。