首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流星,mongodb -食堂优化

流星,mongodb -食堂优化
EN

Stack Overflow用户
提问于 2016-08-04 08:18:17
回答 1查看 87关注 0票数 0

TL;DR:,我正在为一家食堂制作一个应用程序。我有一个收藏的人和一个收藏,在那里我“日志”的每一块肉。我要知道那些没吃过饭的人。

长版本:

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

我试着优化这种情况:

  • 这里有一家食堂,帮助人们在早餐、午餐和晚餐时吃东西。我们需要知道有多少人吃了这顿饭(这很容易)。
  • 如果他们在场,他们必须吃东西,所以我们需要知道有多少(和谁)没有吃(这是我需要优化的部分)。
  • 当他们用餐时,“收银员”插入他们的条形码,程序将“事务”记录在日志集合中。

实际上,在创建模板“食堂”时,我创建了一个本地集合"mealKind“,并使用DB中所有人员的数据(所以ID、姓名、禁食/饱),然后我使用这个集合作为我的计数器,并显示谁吃了这顿饭,谁没有。(变量”mealKind“是=”早餐“或”午餐“或”晚餐“,取决于实际的服务)。

代码语言:javascript
复制
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({});
};

从收集的膳食中,我建立了两个满足的人专栏(姓名、姓氏和条形码)和禁食,我还使用了两个帮手:

代码语言:javascript
复制
  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兼容:表格

EN

回答 1

Stack Overflow用户

发布于 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主页上有一个例子)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38762026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档