1

理想的には属性をデータベースに保存せずに、仮想属性の関数によってMeteorコレクションをクエリするための最良の方法は何ですか。私のコレクションタスクの構造は次のとおりです。

{
  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
}

仮想属性はタスクステータスです-すべてのサブタスクのステータスに基づいて計算されます(たとえば、単一のサブタスクが「赤」の場合、タスクステータスは「赤」です。それ以外の場合、すべてのサブタスクが「緑」の場合、タスクステータスは次のようになります。 「緑」。それ以外の場合、タスクのステータスは「黄色」です)。

テンプレートの1つで、単一のステータスのタスクのみを表示したいと思います。Meteorコレクションでどのような種類のクライアント側クエリを実行できますか?これらのテンプレートがレンダリングされるたびにタスクステータスが再計算されないようにするための推奨される方法はありますか?

ありがとう。

4

1 に答える 1

3

通常、map-reduceが最善のオプションであり、その結果を別のコレクションに保存して、再計算の必要性を回避することができます。ただし、me​​teorはそのバージョンのmini-mongoにmap-reduceを実装していません。

meteorの制約に対するより良いオプションは、そのステータスを再計算し、タスクの状態が変更されたときにコレクション内で更新することです。これにより、更新されないクエリごとに冗長な再計算が不要になります。

データを後処理することもできます。それは少し厄介ですが、あなたはアイデアを得る

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 に答える