2016-04-11 12 views
2

Wie der Titel angegeben hat, verwende ich Express für meine Webapp.Mungo: Streaming Aggregierte JSON-Daten

Derzeit mein Code sieht ungefähr so ​​aus:

API-Controller

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(); 
    }); 

}; 

Statt mit var stream = Doc.find().stream(); möchte ich den Einsatz von aggregate() machen.

Wie find(), aggregate() soll ein lesbarer Stream sein, oder?

Doch als ich einfach find() durch einen aggregate() Aufruf ersetzt, scheint es nicht zu funktionieren.

Es heißt TypeError: Object #<Aggregate> has no method 'stream'. Was ist eine Alternative für das Streaming von aggregierten JSON-Daten?

Antwort

4

Wenn Sie cursor() auf dem Aggregate aufrufen, bevor sie die nachfolgende exec() gibt einen nativen Cursor ausführt, die Sie dann stream() aufrufen können auf die Ergebnisse zu streamen.

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

Nicht genau intuitiv, aber es funktionierte, als ich es versuchte.

+0

Vielen Dank für Ihre Antwort. Ich werde es versuchen. @JohnnyHK. Eine andere Frage: Wenn mein Aufruf 'aggregate()' ein einzelnes Dokument zurückgeben würde, ist es dann nicht sinnvoll, 'stream()' zu verwenden? Von dem, was ich unter 'stream()' mit 'find()' verstehe, werden die Daten pro Dokument zurückgegeben. Ist es möglich, dieses Verhalten zu ändern? – Tacocat

+0

Richtig, es wird als ein Ergebnisdokument pro Datenblock streamen. Keine Möglichkeit, dieses AFAIK zu ändern. – JohnnyHK

+0

Danke für die Bestätigung, @JohnnyHK, :). Wissen Sie zufällig, wie Express Daten beim View Rendering streamen kann? > _ < – Tacocat