【发布时间】:2016-08-06 11:10:51
【问题描述】:
TL;DR: 我正在为食堂制作应用程序。我和这些人有一个集合,还有一个我“记录”每块肉的集合。我需要知道那些没有吃饭的人。
加长版:
我正在为当地红十字会提出申请。
我正在尝试优化这种情况:
有一个食堂,被帮助的人可以在早餐、午餐和晚餐时吃东西。我们需要知道有多少人吃了这顿饭(这很容易)。
-
如果他们在场,他们必须吃饭,所以我们需要知道有多少(以及谁)没有吃(这是我需要优化的部分)。
当他们用餐时,“收银员”插入他们的条形码,程序将“交易”记录在日志集合中。
实际上,在创建模板“食堂”时,我创建了一个本地集合“餐食”,并用数据库中所有人的数据填充它(所以 ID、姓名、禁食/饱食),然后我使用它收集我的柜台,并显示谁吃了饭,谁没有。 (变量“mealKind”是 = “breakfast” OR “lunch” OR “dinner”,具体取决于实际服务。)
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 人。
我不知道如何优化工作流程,我尝试过的所有其他方法都涉及(以某种方式)对数据库的更多查询;我认为我错过了重点,现在我看不到它。 由于 minimongo,我不确定这个级别和流星内部的聚合。
虽然制作这个服务器端而不是客户端很聪明,但这里的问题是如何在不循环所有人员集合的情况下区分“禁食”和“饱食”。
+1 如果解决方案与 aleed:tabular 兼容
【问题讨论】:
-
看起来您完全依赖客户端 minimongo DB 进行
Meals跟踪?如果您的浏览器崩溃/意外关闭会怎样? -
是的,我完全依赖这个。如果浏览器在重新进入应用程序时崩溃,则会触发 onCreated 事件并重新创建本地集合。服务器支持的集合更难维护,因为我每天都必须清除它......
-
对不起,误解了这个问题,当收银员插入交易时,我当然会在 Log 集合中插入一个文档。所以我对饭菜有一个长期的跟踪。如果浏览器崩溃,它可以在不丢失任何数据的情况下恢复。
标签: javascript mongodb meteor optimization aldeed-tabular