Meteor:访问mongo的组功能

时间:2013-09-02 19:04:20

标签: mongodb meteor mapreduce

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

@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的反应性更新将其推广给客户?

1 个答案:

答案 0 :(得分:2)

Meteor不直接支持聚合。要使用这些其他功能,您需要手动执行此操作。

您可以使用大气中的mongodb-aggregation插件来完成大部分缺失的内容。

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

您可以使用聚合管道或地图缩减查询重现您的群组查询。

如果您想在客户端上获得某种类似反应性的查询,您可以解释手柄助手中的数据,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;

}

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