3

mongodb でいくつかのデータ (~500Mb) の CSV ダンプを取得しようとしています。メモリ内に配列を構築してから csv を一度に構築することを避けるために、ストリームを使用するのがよいでしょう。

しかし、マングースが作成するストリームと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 ダンプを取得するにmongoexportは、MongoDB に付属のツールを使用します。データベース「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

このようなものがうまくいくはずです。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 に答える