我试图得到一个未知大小的数据集合的平均值,所以我想在服务器端写这样的东西:
@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的反应性更新将其推广给客户?
答案 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缺少它。