通过虚拟属性上的函数查询Meteor Collection的最佳方法是什么,理想情况下不将属性保存到db。我的集合Tasks具有以下结构:
{
name:"Freezer Area",
subtasks:[
{id:1,status:"red",name:"Unlock freezer"},
{id:2,status:"yellow",name:"Check daily stock"},
{id:3,status:"yellow",name:"Rotate stock"}
],
managerId:curly
}
虚拟属性是任务状态 - 根据其所有子任务的状态计算(例如,如果单个子任务为“红色”,则任务状态为“红色”;否则,如果所有子任务为“绿色”,则任务状态为“绿色”;否则任务状态为“黄色”)。
在我的一个模板中,我只想显示单个状态的任务。我可以在Meteor Collection上运行什么样的客户端查询?是否有建议的方法来避免每次渲染这些模板时重新计算任务状态?
感谢。
答案 0 :(得分:3)
通常做你想要的事情map-reduce是最好的选择,它会将结果存储在一个单独的集合中,这可以避免重新计算。然而,meteor在其mini-mongo版本中没有实现map-reduce。
流星限制的一个更好的选择是重新计算其状态,并在任务状态发生变化时在集合中更新它,这样就不需要对每个非更新查询进行冗余重新计算。
您还可以发布处理数据。它有点乱,但你明白了
results = virtualize_status(Collection.find({}).fetch());
//this function goes through and adds the status
function virtualize_status(results) {
var totalresults = results.length, element = null;
for (var i = 0; i < length; i++) {
element = results[i];
green = 0;
red = 0;
for (var j = 0; j < element.subtasks.length; j++) {
if(element.subtasks[j].status == "green") {
green++;
}
else if(element.subtasks[j].status == "red") {
red++;
}
}
final_status = "yellow";
if(red > 0) {
final_status = "red";
}
else if(green == element.subtasks.length) {
final_status = "green"
}
results[i]["status"] = final_status;
}
return results;
}