我在节点中使用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);
})
是否有任何方法或解决方案可以提供任何性能优势,或仅仅是为了更好地实现这一目标?
任何帮助都将不胜感激。
答案 0 :(得分:1)
解决方案取决于用例。
如果处理后的数据不经常更改,您可以拥有一个包含已处理数据的辅助数据库。
您可以按照现在的方式使用分页从主数据库加载未处理的数据。并且可以在单个查询中从辅助数据库加载所有已处理的数据。
答案 1 :(得分:1)
只要您的数据集不够大,性能可能会很低,这很好。当它达到千兆字节级别时,您的应用程序将简单地中断,因为在将数据发送到客户端之前,机器将没有足够的内存来存储您的数据。发送千兆字节的报告数据也需要花费很多时间。这里有一些建议: