node.js处理大量数据

时间:2017-04-28 11:54:59

标签: node.js mongodb mongoose promise

我在节点中使用mongoose。 我正在请求从远程数据库中检索项目集合。为了获得完整的报告,我需要解析整个集合,这是一个很大的集合。

我避免接近这样的事情:

model.find({}, function(err, data) {
  // process the bunch of data
})

现在,我使用递归方法来提供局部变量。稍后我会将有关该流程的信息作为回复发回。

app.get('/process/it/',(req,res)=>{

  var processed_data=[];

  function resolve(procdata) {
    res.json({status:"ok", items:procdata.length});
  }

  function handler(data, procdata, start, n) { 
    if(data.length <= n)    
      resolve(procdata);
    else {
      // do something with data: push into processed_data
      procdata.push(whatever);

      mongoose.model('model').find({}, function(err, data){     
        handler(data, procdata, start+n, n);    
      }).skip(start).limit(n);
    }
  }

  n=0
  mysize=100

  // first call
  mongoose.model('model').find({}, function(err, data){ 
    handler(data, processed_data, n, mysize);

  }).skip(n).limit(mysize);

})

是否有任何方法或解决方案可以提供任何性能优势,或仅仅是为了更好地实现这一目标?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

解决方案取决于用例。

如果处理后的数据不经常更改,您可以拥有一个包含已处理数据的辅助数据库。

您可以按照现在的方式使用分页从主数据库加载未处理的数据。并且可以在单个查询中从辅助数据库加载所有已处理的数据。

答案 1 :(得分:1)

只要您的数据集不够大,性能可能会很低,这很好。当它达到千兆字节级别时,您的应用程序将简单地中断,因为在将数据发送到客户端之前,机器将没有足够的内存来存储您的数据。发送千兆字节的报告数据也需要花费很多时间。这里有一些建议:

  • 尝试通过Mongo聚合框架聚合数据,而不是通过应用程序代码进行聚合
  • 尝试将报告数据分解为较小的报告
  • 预生成报告数据,将其存储在某个地方(可能是另一个集合),只需在需要查看时发送给客户