流星,mongodb - 食堂优化

时间:2016-08-04 08:18:17

标签: javascript mongodb meteor optimization aldeed-tabular

TL; DR: 我正在为食堂制作应用程序。我有一个人和一个集合的集合,我和#34; log"每一块肉都吃了。我需要知道那些吃饭的人。

长版:

我正在申请当地的红十字会。

我试图优化这种情况:

  • 有一个食堂,帮助人们可以在早餐,午餐和晚餐时吃点东西。我们需要知道吃了多少餐(这很容易)。

  • 如果他们在场,他们必须吃饭吃饭,所以我们需要知道有多少(和谁)吃了(这是我需要优化的部分)。

  • 当他们吃饭时,"收银员"插入条形码,程序记录"交易"在日志集合中。

实际上,在创建模板"食堂"我创建了一个本地收藏品#34;饭菜"并用数据库中所有人的数据填充它(如此ID,名称,禁食/饱食),然后我将这个集合用于我的计数器,并显示谁吃饭和谁没有。 (变量" mealKind" ="早餐" OR"午餐"或"晚餐"取决于实际服务。)

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人。

我无法弄清楚如何优化工作流程,我尝试的所有其他方法(以某种方式)对数据库的更多查询;我想我错过了这一点,现在我看不到它。 由于Minorongo,我不确定此级别和流星内部的聚合。

虽然使这个服务器端而不是客户端是聪明的,但这里的问题是如何区分"禁食" vs"满足"没有骑自行车所有的人。

如果解决方案与aleed兼容,则

+1:表格

1 个答案:

答案 0 :(得分:0)

修改

我仍然不确定导致性能问题的原因(客户端内存/ minimongo中有太多东西,调用太多东西?),但你至少可以尝试不同的方法,更传统的方法是基于你的服务器。 / p>

顺便说一句,您没有提及您显示数据的方式,也没有提及您已经提供/缺少Persons的数量的错误读数?

如果您要构建经典HTML table,请注意浏览器难以渲染超过几百行。如果您在这种情况下,您可以实现客户端表分页/无限滚动。查看jQuery DataTables插件(基于aldeed:tabular)的示例。跳过构建实际HTML table的步骤,并使用$table.rows.add(myArrayOfData).draw()直接填写它以避免浏览器限制。

原始回答

我不完全理解为什么您需要将Persons集合复制到客户端Meals本地集合中?

这要求您拥有从服务器发送到客户端的Persons的第一个所有文档(如果您的服务器连接良好/本地,这可能不会有问题。您可能还有{ {1}}打包,所以你已经看到了这个惩罚),然后克隆所有文件(检查你的autopublish集合以检索任何以前的段落),有效地使你的记忆需求翻倍。

您的服务器和/或远程数据库是否慢速证明您需要在本地(客户端)执行所有操作?

可能会出现问题,如果您打开多个“收银台”/客户端浏览器,他们的Logs本地馆藏将无法同步。

如果您的服务器 - 客户端连接良好,则没有理由在客户端执行任何操作。 Meteor将自动缓存所需内容,并提供乐观的数据库修改以保持用户体验快速(如果您正确构建代码)。