尝试在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)
那么,这是否是正确的方法?如果是这样,流的问题是什么?
答案 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),而之前的答案是使用旧版本的模块。