【问题标题】:Meteor: Accessing group function of mongoMeteor:访问 mongo 的组功能
【发布时间】:2017-06-24 05:29:07
【问题描述】:

我正在尝试获取未知大小的数据集合的平均值,因此我想在服务器端编写类似这样的内容:

@Mileage = new Meteor.Collection("mileage")

Meteor.publish "average",  ->
  Mileage.group
    initial:
      count: 0
      total: 0

    reduce: (doc, out) ->
      out.count++
      out.total += doc.mileage

    finalize: (out) ->
      out.avg = out.total / out.count

我可以做一个meteor mongo,这段代码(当然翻译成Javascript)工作正常。如何访问 Collection.group 之类的聚合函数?或者有没有更好的方法来做到这一点,我错过了?

另外,是这样的反应。假设我在客户端上有订阅这个的东西,并且它在模板中被引用。当mileage 文档集合中的某些内容发生变化时,平均值也会发生变化。我能否依靠 Meteor 的响应式更新将其推送给客户端?

【问题讨论】:

    标签: mongodb meteor mapreduce


    【解决方案1】:

    Meteor 不直接支持聚合。要使用这些其他功能,您需要手动完成。

    你可以使用mongodb-aggregation 插件在气氛中完成大部分缺失的工作。

    唯一的问题是您无法在客户端 (minimongo) 上正确执行这些类型的查询。您可以这样做,但查询将通过方法调用中继到服务器。 (意味着它没有反应)

    您可以使用聚合管道或 map reduce 查询重现您的组查询。

    如果您想在客户端获得某种响应式查询,您可以解释车把助手中的数据,underscore 可能会有所帮助:

    Template.hello.average = function() {
        var count;
        var data = YourCollection.find().map(function(doc) {
            count++;
            return doc.mileage;
        });
    
    
        var reduce = _.reduce(data, function(total, item) {
            return total+item;
        });
    
        return reduce / count;
    
    }
    

    当然,它可以对你想要做的事情进行一些修改,但想法是使用下划线的 reduce 来代替 minimongo 的不足。

    【讨论】:

    • 我显然没有在这里得到一些东西。如果我有(比如说)20K 文档的数据集合,那么在客户端计算平均值可能是个坏主意。这不会使客户端和服务器之间的并行性无关紧要吗?我也不确定如何做到这一点,所以当有人改变他们的里程时,每个人都会看到平均变化。
    • 也许您可以将它的缓存值存储在另一个集合中并在服务器上计算它。这样你就可以让它既反应又不用太担心计算的大小?
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 2014-04-04
    • 2012-09-27
    • 2020-12-06
    • 2014-07-10
    • 1970-01-01
    • 2014-06-02
    • 2016-07-14
    相关资源
    最近更新 更多