按虚拟属性查询流星集合

时间:2013-01-13 05:07:18

标签: mongodb meteor

通过虚拟属性上的函数查询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上运行什么样的客户端查询?是否有建议的方法来避免每次渲染这些模板时重新计算任务状态?

感谢。

1 个答案:

答案 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;
}