Node.js,Express,MongoDB和流

jtr*_*ans 9 javascript stream mongodb node.js express

我正在寻找通过我的Node.js服务器层将数据从MongoDB传输到我的Web客户端的最佳方法.我要求每个查询大约10MB的数据,并且查询已经在day_timestamp上编入索引.请注意,我已经阅读过这篇文章了.

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

MongoClient = require('mongodb').MongoClient;
Run Code Online (Sandbox Code Playgroud)

目前我的代码看起来像这样:

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)
    });
});
Run Code Online (Sandbox Code Playgroud)

这可行,但与"普通"collection.find()回调嵌套相比,似乎没有提供任何性能提升 res.json(...);

我想了解一些事情.

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

其次,我将如何添加一个示例来计算此流性能与正常的collection.find()回调?对于后一个例子,我可以很容易地实现这一点,但我不清楚我将如何使用流示例(nb stream.end看起来不像我期望的那样工作因为.pipe)

第三,我试图尽快将我的数据从MongoDB传送到我的客户端,并且我的Node.js不需要做太多(如果有的话)数据处理,因为数据是按照数据库中的需要存储的.我是否采用写作方式实现这一目标?

alg*_*oni 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();
});
Run Code Online (Sandbox Code Playgroud)