0

我试图获得一个未知大小的数据集合的平均值,所以我想在服务器端写这样的东西:

@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 的响应式更新将其推送给客户?

4

1 回答 1

2

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

您可以在大气上使用mongodb-aggregation插件来完成大部分缺失的工作。

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

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

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

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 的不足。

于 2013-09-02T19:17:35.313 回答