1

通过虚拟属性上的函数查询流星集合的最佳方法是什么,最好不要将属性保存到数据库中。我的收藏任务具有以下结构:

{
  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 上运行什么样的客户端查询?是否有推荐的方法来避免每次呈现这些模板时重新计算任务状态?

谢谢。

4

1 回答 1

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;
}
于 2013-01-13T07:31:24.897 回答