Node.js、Express、MongoDB和流技术

9
我正在寻找通过我的Node.js服务器层将数据从MongoDB流式传输到我的Web客户端的最佳方法。每次查询我请求大约10MB的数据,而查询已经在day_timestamp上进行了索引。请注意,我已经阅读了这篇文章。 我正在使用的唯一与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()回调?对于后者的示例,我可以轻松实现此操作,但我不清楚如何在流示例中执行此操作(注:stream.end似乎无法按照我期望的方式工作,可能是因为.pipe

第三,我正在尝试尽快将我的数据从MongoDB传输到客户端,并且我的Node.js不必进行太多(如果有的话)数据处理,因为数据存储在数据库中所需的方式。我是否正在以正确的方式实现此目标?


1
21个浏览量?这是一个热门话题,却没有任何答案 :( ? - jtromans
为什么使用JSONStream?可以直接使用管道:http://mongoosejs.com/docs/api.html#querystream_QueryStream-pipe - malix
感谢您在30个月后留下评论 ;) 现在我已经记不清我是如何解决这个问题的了。 - jtromans
2
你真的应该自己去研究一下并回答这个问题,以便将其标记为已解决...并回馈社区! - Emile Bergeron
我经常这样做,只是在这个上面忘记了。 - jtromans
是的,我刚在看未回答的Express问题 :) - malix
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接