我仍在尝试学习流星,并希望返回一个人的平均分数(基于他们众多的评分) - 用户将被评为4个变量,我想返回他们的“记分卡”使用辅助函数。
列出数据库中所有用户(基于某个过滤器)的最佳(最有效)方法是什么 - 使用辅助函数?
我的收藏(工人):
{
"_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以返回每个用户的实际定义平均值?
答案 0 :(得分:1)
您不需要传递组密钥的实际ObjectId
值,使用文档的_id
密钥名称并创建一个首字母 {{3管道将过滤特定参数化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" }
} }
]);
}
});
如果你可以运行具有非常有用的新聚合功能的MongoDB 3.4及更高版本,你可以试用 $match
运算符,它允许你从列表中计算平均值而不需要要 $reduce
和 $unwind
,您可以在单个管道中执行以下操作:
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"] }
} }
]);
}
});