【问题标题】:Meteor Avg Aggregate from Publish to Helpers从发布到助手的 Meteor Avg 聚合
【发布时间】:2015-09-25 05:25:53
【问题描述】:

我正在从事一项流星项目,我需要在该项目中获取评论分数的平均值。我遇到了 meteorhacks:aggregate 包,但无法实现它。

发布:

Meteor.publish('supplierReviewsOverall', function(userid){

var pipeline = [
    {
        $match: {
            supplier: userid
        }
    },
    {
        $group: {
            _id: null,
            rate_overall : { $avg: "$rate_overall" },
            rate_timeliness : { $avg: "$rate_timeliness" },
            rate_quality : { $avg: "$rate_quality" },
            rate_value : { $avg: "$rate_value" }
        }
    }
]

return SupplierReviews.aggregate(pipeline);
});

我收到此错误:错误:发布函数返回了一个非游标数组。

那么,我将如何获取帮助器的值,以便我可以将数据放入 HTML 中??

非常感谢!!!

【问题讨论】:

    标签: javascript meteor aggregate publish helpers


    【解决方案1】:

    基本答案:这是因为您需要在出版物中返回 Cursor

    你的可能性太大了:

    1. 您可以使用聚合结果重新创建游标,但请注意,您将失去反应性:这意味着除非您重新加载模板,否则您不会获得外部更新。为此,您只需将 SupplierReviews.aggregate(pipeline); 包装成 var buffer = SupplierReviews.aggregate(pipeline); 并对其进行迭代以将数组的每个项目添加到发布光标中:

      _(buffer).each(function(item){ self.added ('SupplierReviews', item._id, item); }; self.ready();

    2. 我个人的最爱:你不需要聚合(和松散的反应来实现average 操作。你可以使用一个简单的Collection.find() 查询并使用cursor.Observe 的巧妙组合来扩展/减少/修改它和有条件的修改。看看这个答案,它对我有用(我需要一个总和,但你可以轻松地将它调整为平均值):https://stackoverflow.com/a/30813050/3793161
    3. 如果您计划拥有多台服务器,请注意每台服务器都必须observe,因此可能会导致不必要的负载。所以我的第三个解决方案是 use collection hooks 或为您需要的每个值更新附加字段 average 的方法。在此处查看@David Weldon 对此的回答:https://stackoverflow.com/a/31190896/3793161

    【讨论】:

    • 谢谢!我喜欢第一种方法,即使我会失去反应性。我的问题是,如何在帮助程序中访问它以便可以在视图中打印出来?谢谢!
    • 您需要订阅您的出版物。一旦你有了,你可以在模板数据上下文中访问你的数据,如果你将它绑定到它。在您的助手内部,取决于它的位置,它将是 this.data.yourDatathis.yourData。第二种解决方案,您将可以直接访问SupplierReviews 集合的 minimongo 版本。您可以使用SupplierReviews.find()“直接”访问它。看看这里以获得更好的理解:discovermeteor.com/blog/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多