【问题标题】:Mongoose: Streaming Aggregated JSON DataMongoose:流式聚合 JSON 数据
【发布时间】:2016-08-01 00:14:17
【问题描述】:

正如标题所示,我正在为我的 web 应用程序使用 Express

目前,我的代码如下所示:

API 控制器

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(),而不是使用var stream = Doc.find().stream();

find()aggregate() 应该是可读流,对吧?

然而,当我简单地将 find() 替换为 aggregate() 调用时,它似乎不起作用。

它显示类型错误:Object #<Aggregate> has no method 'stream'。什么是流式传输聚合 JSON 数据的替代方案

【问题讨论】:

    标签: mongoose streaming aggregate


    【解决方案1】:

    如果您在执行之前在Aggregate 上调用cursor(),则后续的exec() 会返回一个本机游标,然后您可以调用stream() 以流式传输结果。

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

    不是很直观,但我试过了。

    【讨论】:

    • 感谢您的回答。我会试试看。 @JohnnyHK。另一个问题:如果我的aggregate() 调用要返回一个文档,那么使用stream() 没有意义吗?根据我对使用stream()find() 的理解,数据是按文档返回的。是否有可能改变这种行为?
    • 对,它将作为每个数据块的一个结果文档流式传输。没有办法改变那个 AFAIK。
    • 感谢@JohnnyHK 对此的确认,:)。无论如何,你知道有什么方法可以让 Express 在视图渲染中支持数据流吗? >_
    猜你喜欢
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2020-02-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多