1

Ich versuche immer noch, Meteor zu lernen, und möchte die durchschnittliche Punktzahl einer Person (basierend auf ihren zahlreichen Bewertungen) zurückgeben - ein Benutzer wird auf 4 Variablen bewertet werden, Und ich möchte ihre "Scorecard" mit Hilfe einer Hilfsfunktion zurückgeben.meteor .helper Funktion Eingangsparameter, um ein Objekt zurückzugeben

Was ist die beste (effizienteste) Möglichkeit, alle Benutzer in einer Datenbank aufzulisten (basierend auf einem bestimmten Filter) - mit Hilfe einer Hilfsfunktion?

meine Sammlung (Arbeiter):

{ 
    "_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 
      } 
     } 
    ] 
} 

meine Vorlage:

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

mein Helfer:

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

wie oben sehen ... ich richtig bin nicht vorbei die Benutzer-ID, um den tatsächlich definierten Durchschnitt pro Benutzer zurückzugeben?

Antwort

1

Sie brauchen nicht, verwenden Sie das _id Schlüsselnamen des Dokuments in dem aktuellen ObjectId Wert für den Gruppenschlüssel zu übergeben und eine anfängliche $match Pipeline erstellen, die die Dokumente für diese bestimmte parametrisierte id dh

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

Wenn Sie MongoDB 3.4 und höher, die eine sehr nützliche neue Aggregationsfunktionen ausführen können, können Sie die $reduce Betreiber versuchen, mit dem Sie die aver berechnen erlaubt Alter aus einer Liste ohne die Notwendigkeit, $unwind und $group, Sie können es nur in einer einzigen Pipeline wie folgt:

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