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

... 내가 사용자 당 실제 정의 된 평균을 반환하는 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이있는 큰 매우 유용한 새로운 통합 기능을 실행할 수있는 경우


, 당신은 단언을 계산할 수있는 $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"] } 
      } } 
     ]); 
    } 
});