【问题标题】:meteor .helpers function input parameter to return an object流星 .helpers 函数输入参数以返回一个对象
【发布时间】:2017-09-05 07:51:17
【问题描述】:

我仍在尝试学习流星,并希望返回一个人的平均分数(基于他们的众多评分)——一个用户将根据 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"}
            }
        })
            },
        });

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

【问题讨论】:

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


    【解决方案1】:

    您不需要为组键传递实际的 ObjectId 值,使用文档的 _id 键名称并创建一个初始的 $match 管道来过滤文档对于那个特定的参数化 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 及更高版本,您可以尝试 $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"] }
                } }
            ]);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 2019-10-27
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 2020-08-22
      • 2016-03-04
      • 2019-03-03
      • 2012-07-17
      相关资源
      最近更新 更多