TL;DR:,我正在为一家食堂制作一个应用程序。我有一个收藏的人和一个收藏,在那里我“日志”的每一块肉。我要知道那些没吃过饭的人。
长版本:
我在为我的当地红十字会申请。
我试着优化这种情况:
实际上,在创建模板“食堂”时,我创建了一个本地集合"mealKind“,并使用DB中所有人员的数据(所以ID、姓名、禁食/饱),然后我使用这个集合作为我的计数器,并显示谁吃了这顿饭,谁没有。(变量”mealKind“是=”早餐“或”午餐“或”晚餐“,取决于实际的服务)。
Template.canteen.created = function(){
Meals=new Mongo.Collection(null);
var today= new Date();today.setHours(0,0,1);
var pers=Persons.find({"status":"present"},{fields:{"Name":1,"Surname":1,"barcode":1}}).fetch();
pers.forEach(function(uno){
var vediamo=Log.findOne({"dest":uno.codice,"what":mealKind, "when":{"$gte": today}});
if(typeof vediamo=="object"){
uno['eat']="satiated";
}else{
uno['eat']="fasting";
}
Meals.insert(uno);
});
};
Template.canteen.destroyed = function(){
meals.remove({});
};从收集的膳食中,我建立了两个满足的人专栏(姓名、姓氏和条形码)和禁食,我还使用了两个帮手:
fasting:function(){
return Meals.find({"eat":"fasting"});
}
"countFasting":function(){
return Meals.find({"eat":"fasting"}).count();
}
//same for satiated这是可以的,但现在人数确实在增加(我们大约有1000人在计算),页面的创建非常缓慢,而且通常都会出现错误,这样我就可以读到"100禁食,400饱了“,但我在DB中有大约1000人。
我不知道如何优化工作流,我尝试过的其他方法(以某种方式)都涉及到对DB的更多查询;我认为我错过了重点,现在我看不到它。我不确定在这个水平和流星内部的聚集,因为最小的流星。
虽然使这个服务器端而不是客户端很聪明,但这里的问题是如何区分“禁食”和“满足”而不循环所有的人员集合。
+1如果解决方案与aleed兼容:表格
发布于 2016-08-05 02:00:15
编辑
我仍然不确定是什么导致了性能问题(客户机内存/ minimongo中太多的东西,对它的调用太多了?),但是您至少可以尝试不同的方法,更传统地基于您的服务器。
顺便说一句,您既没有提到如何显示数据,也没有提到如何获得已服务/丢失的Persons号码的错误读取。
如果您正在构建一个经典的HTML,请注意浏览器很难呈现超过几百行。如果在这种情况下,可以实现客户端表分页/无限滚动。例如,看看jQuery DataTables插件(基于aldeed:tabular)。跳过构建实际HTML table的步骤,直接使用$table.rows.add(myArrayOfData).draw()填充它,以避免浏览器限制。
原始答案
我不完全理解为什么需要将Persons集合复制到客户端Meals本地集合中?
这需要首先将Persons的所有文档从服务器发送到客户端(如果服务器连接良好/本地的话,这可能不会有问题。您还可能仍然有autopublish包,因此您可能已经看到了这种惩罚),然后克隆所有文档(检查您的Logs集合以检索前面的任何段落),从而有效地增加了您的内存需求。
您的服务器和/或远程DB是否很慢才能证明您需要在本地(客户端)完成一切?
如果您打开了多个“出纳员”/客户端浏览器,则它们的Meals本地集合将不会同步。
如果您的服务器-客户端连接良好,则没有理由做所有的客户端操作。Meteor将自动缓存所需的内容,并提供乐观的DB修改,以保持用户体验的快速(如果您的代码结构正确)。
aldeed:tabular包,您可以轻松地通过“页面”显示您的Persons大表。Logs ( dburles:collection-helpers )将其链接到您的aldeed:tabular集合(在aldeed:tabular主页上有一个例子)。https://stackoverflow.com/questions/38762026
复制相似问题