meteor .helpers函数输入参数返回一个对象

时间:2017-04-10 10:05:00

标签: mongodb meteor mongodb-query parameter-passing aggregation-framework

我仍在尝试学习流星,并希望返回一个人的平均分数(基于他们众多的评分) - 用户将被评为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以返回每个用户的实际定义平均值?

1 个答案:

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