1

我仍然试图学习流星,并想返回一个人的平均分数(根据他们的众多评分) - 用户将被评为4个变量,我想用助手函数返回他们的“记分卡”。流星.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"} 
      } 
     }) 
      }, 
     }); 

,你可以在上面看到...我没有正确地传递用户ID返回每个用户实际定义的平均值?

回答

1

你并不需要在组密钥实际ObjectId值传递,使用文档的_id键名,并创建一个初始$match管道,将过滤文件的特定参数化ID IE

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" } 
      } } 
     ]); 
    } 
}); 

如果你能执行MongoDB 3.4和更高它具有非常实用的新聚合功能,你可以尝试一下$reduce运营商允许你计算AVER从列表中年龄而不需要$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"] } 
      } } 
     ]); 
    } 
}); 
相关问题