1

私はまだ流星を学ぼうとしており、(その多数の評価に基づいて)人の平均得点を返したいと思います。そして私は彼らの "スコアカード"ヘルパー関数を使用して返すしたいと思います。流星.helpersは、オブジェクトを返すための入力パラメータを受け取ります。

(特定のフィルタに基づいて)データベース内のすべてのユーザーを一覧表示する最も効率的な方法は何ですか - ヘルパー関数を使用しますか?

私のコレクション(労働者):

{ 
    "_id" : ObjectId("58d3dc44353972841db96049"), 
    "name" : "James", 
    "surname" : "Jones", 
    "createdAt" : ISODate("2017-03-23T14:31:32.512Z") 
    ], 
    "Hist" : [ 
     { 
      "itemDate" : "01/2017", 
      "skill" : "", 
      "review" : { 
       "client" : "101" 
      }, 
      "traits" : { 
       "speed" : 3.0, 
       "distance" : 2.0, 
       "reliability" : 3.0, 
       "overall" : 4.0 
      } 
     } 
    ] 
} 

私のテンプレート:

<template name="scoreCard" > 
    <table> 
     <tr> 
      <div class="col s3">Average Speed</div> 
       <div class="progress grey lighten-4"> 
        <div class="determinate" style="width:{{aSpeed this.userId }}%"> 
         <span class="amount">{{aSpeed this.userId}}</span> 
        </div> 
      </div> 
     </tr> 
    </table> 
</template> 

私のヘルパー:

Template.scoreCard.helpers({ 
    userSkills(userId){ 
     return Workers.aggregate(
     {$unwind:"$Hist"}, 
     {$group: { 
       _id:ObjectId(userId), 
       aSpeed: { $avg: "$Hist.traits.speed"}, 
       aDist: { $avg: "$Hist.traits.distance"}, 
       aRel: { $avg: "$Hist.traits.reliability"}, 
       aOver: { $avg: "$Hist.traits.overall"} 
      } 
     }) 
      }, 
     }); 

あなたは上記を参照できるよう...私は正しく渡していないのですユーザーごとに実際に定義された平均を返すuserID

答えて

1
あなたは、グループキーの実際の ObjectId値を渡す文書の _idキー名を使用し、すなわちその特定のパラメータ化ID

Template.scoreCard.helpers({ 
    userSkills(userId) { 
     return Workers.aggregate([ 
      { "$match": { "_id": ObjectId(userId) } }, 
      { "$unwind": "$Hist" }, 
      { "$group": { 
       "_id": "$_id", // or _id: null 
       "aSpeed": { "$avg": "$Hist.traits.speed" }, 
       "aDist": { "$avg": "$Hist.traits.distance" }, 
       "aRel": { "$avg": "$Hist.traits.reliability" }, 
       "aOver": { "$avg": "$Hist.traits.overall" } 
      } } 
     ]); 
    } 
}); 
のためのドキュメントをフィルタします初期 $matchパイプラインを作成する必要はありません


あなたは非常に便利な新アグリゲーション機能を備えていMongoDBの3.4以降を実行することができれば、あなたはAVERを計算することができます$reduceオペレータを試してみることができます$unwind$groupしなくても、リストから年齢以下のように、あなただけの単一のパイプラインでそれを行うことができます。

Template.scoreCard.helpers({ 

    sum(key) { 
     return { 
      "$reduce": { 
       "input": "$Hist", 
       "initialValue": 0, 
       "in": { "$add": ["$$value", key] } 
      } 
     } 
    } 

    userSkills(userId) { 
     return Workers.aggregate([ 
      { "$match": { "_id": ObjectId(userId) } }, 
      { "$addFields": { 
       "histSize": { 
        "$cond": [ 
         { "$eq": [ { "$size": "$Hist" }, 0 ] }, 
         1, 
         { "$size": "$Hist" } 
        ] 
       } 
      } }, 
      { "$addFields": { 
       "aSpeed": { "$divide": [sum("$$this.traits.speed"), "$histSize"] }, 
       "aDist": { "$divide": [sum("$$this.traits.distance"), "$histSize"] }, 
       "aRel": { "$divide": [sum("$$this.traits.reliability"), "$histSize"] }, 
       "aOver": { "$divide": [sum("$$this.traits.overall", "$histSize"] } 
      } } 
     ]); 
    } 
}); 
関連する問題