【问题标题】:Node.js, Express, MongoDB and streamsNode.js、Express、MongoDB 和流
【发布时间】:2014-03-20 01:41:43
【问题描述】:

我正在寻找通过我的 Node.js 服务器层将数据从 MongoDB 流式传输到我的 Web 客户端的最佳方式。我请求每个查询大约 10MB 的数据,并且查询已经在 day_timestamp 上建立了索引。注意,I have already read this post.

我正在使用的唯一Mongo相关模块如下(我需要其他人来实现我的目标吗?):

MongoClient = require('mongodb').MongoClient;

目前我的代码如下所示:

MongoClient.connect('mongodb://host:port/myDatabase', function(err, db) {
    if(err) throw err;
    console.log("Connected to Database");

    // Server picks up URL requests made by browser
    app.get("/:type/:category/:resolution/:from/:to/", function (req, res){
        var start = moment();

        var type = String(req.params.type)
            ,category = String(req.params.category)
            ,resolution = String(req.params.resolution)
            ,from = moment.utc(req.params.from).toDate()
            ,to = moment.utc(req.params.to).toDate()
            ,options = {
                parse : true, 
                accept : 'application/json'
            };

        res.set('Content-Type', 'application/json'); // Required?
        res.writeHead(200, { 'Content-Type': 'application/json'}); // Required?
        var collection = db.collection(category);
        var stream = collection.find({'day_timestamp':{'$gte':from, '$lte':to}})
            .sort({day_timestamp:1})
            .stream()
            .pipe(JSONStream.stringify())
            .pipe(res)
    });
});

这可行,但与“正常”collection.find() 回调嵌套res.json(...);相比似乎没有提供任何性能提升@

我想了解一些事情。

首先,我想将数据从 MongoDB 直接流式传输到我的 Nods.js 服务器……一旦它到达我的服务器,就直接将其流式传输到客户端。如果需要,这可以一直是 BSON,我可以在客户端反序列化它。这可能吗?

其次,我将如何添加一个示例来计时此流性能与正常的 collection.find() 回调?使用后一个示例,我可以轻松实现这一点,但我不清楚如何使用流示例来实现(由于.pipe,nb stream.end 似乎无法正常工作,因为.pipe

第三,我试图尽可能快地将我的数据从 MongoDB 获取到我的客户端,并且我的 Node.js 不需要做太多(如果有的话)数据处理,因为数据是按要求存储在数据库中的。我是否正在以实现这一目标的书面方式来处理事情?

【问题讨论】:

  • 21 次观看?这是一个如此热门的话题,没有答案:(?
  • 为什么使用 JSONStream?直接管:mongoosejs.com/docs/api.html#querystream_QueryStream-pipe
  • 感谢您在 30 个月后发表评论;)不记得我现在是如何解决这个问题的。
  • 你真的应该调查它并自己回答问题以将其标记为已回答......并回馈社区!
  • 我经常这样做,我只是忘记了这个

标签: javascript node.js mongodb express stream


【解决方案1】:

每次有数据要写入时,它都会写入res

var stream = collection.find({'day_timestamp':{'$gte':from, '$lte':to}})
    .sort({day_timestamp:1})
    .stream();

stream.on('data', function(data) {
  res.write(JSON.stringify(data));
});

stream.on('end', function() {
  res.end();
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2017-01-21
    相关资源
    最近更新 更多