2016-04-11 26 views
2

タイトルに示されているように、私はwebappにExpressを使用しています。Mongoose:ストリーミング集約JSONデータ

現在、私のコードは次のようなものになります。

APIコントローラの代わりに使用してvar stream = Doc.find().stream();

var mongoose = require('mongoose'); 
var Doc = mongoose.model('Document'); 

var sendJSONresponse = function(res, status, content) { 
    res.status(status); 
    res.json(content); 
}; 

// "/api/documents" 
module.exports.listAllDocuments = function(req, res) { 

    var stream = Doc.find().stream(); 
    stream.on('data', function (chunk) { 
    res.write(JSON.stringify(chunk)); 
    }).on('error', function (err) { 
    console.log('Error: ' + err); 
    }).on('end', function() { 
    res.end(); 
    }); 

}; 

を、私はaggregate()の利用をしたいです。

find()のように、aggregate()は読み込み可能なストリームであると思われます。

しかし、find()aggregate()コールに置き換えただけでは機能しないようです。

「TypeError:Object #<Aggregate> has no method 'stream'」と表示されます。集約されたJSONデータストリーミングの代替手段

答えて

4

あなたはそれを実行する前Aggregatecursor()を呼び出した場合、その後のexec()は、あなたがその結果をストリーミングするためにstream()を呼び出すことができるネイティブのカーソルを返します。

var stream = Doc.aggregate(pipeline).cursor().exec().stream(); 
stream.on('data', ... 

直感的ではありませんが、試してみるとうまくいきました。

+0

ありがとうございます。やってみます。 @ JohnnyHK。別の質問:私の 'aggregate()'呼び出しが一つの文書を返すのであれば、 'stream()'の使用は何もないのでしょうか? 'stream()'と 'find()'を使って理解したところから、データはドキュメントごとに返されます。この動作を変更することは可能ですか? – Tacocat

+0

これは、データチャンクごとに1つの結果ドキュメントとしてストリームします。そのAFAIKを変更する方法はありません。 – JohnnyHK

+0

それを確認してくれてありがとう、@ JohnnyHK、:)。万が一、ビューレンダリングでExpressサポートのデータストリーミングを行う方法がありますか? > _ < – Tacocat