2014-02-19 106 views
8

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

我使用的唯一蒙戈相关模块如下(我需要别人来实现自己的目标?):

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似乎不可能工作)

第三,我试图尽可能快地从MongoDB获取数据到我的客户端,而我的Node.js不需要做太多(如果有的话)数据处理,因为数据按照需要存储在数据库中。我是否在谈论写作方式来实现这一目标?

+1

21看法?这是一个热门话题,没有答案:(? – jtromans

+0

为什么使用JSONStream?直接管道:http://mongoosejs.com/docs/api.html#querystream_QueryStream-pipe – malix

+0

感谢30个月后的评论;)不记得如何我现在解决了。 – jtromans

回答

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