Mongodb Meteor:访问mongo的组功能
我试图获得未知大小的数据收集的平均值,因此我想在服务器端编写如下内容:Mongodb Meteor:访问mongo的组功能,mongodb,meteor,mapreduce,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.mileag
@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
?还是有更好的方法可以做到这一点,而我却错过了
还有,是这样的反应。假设我在客户机上订阅了一些东西,并且它在模板中被引用。当
里程数
文档集合中的某些内容发生变化时,平均值也会发生变化。我是否能够依靠Meteor的反应式更新将其推送到客户端?Meteor不直接支持聚合。要使用这些其他功能,您需要手动执行
您可以使用atmosphere上的插件来完成大部分缺少的内容
唯一的问题是,您不能在客户机上正确地执行这些类型的查询(minimongo)。您可以执行这些操作,但查询将通过方法调用中继到服务器。(意思是它不是反应性的)
您可以使用聚合管道或map reduce查询重新生成组查询
如果您希望在客户端上获得某种反应式查询,您可以在Handlebar helpers中解释数据,这可能会有所帮助:
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的reduce。我显然没有得到一些东西。如果我收集了(比如)20K个文档的数据,计算客户端的平均值可能是个坏主意。这难道不会使客户机和服务器之间的并行性变得无关紧要吗?我也不知道如何做到这一点,当有人改变他们的里程时,每个人都能看到平均的变化。也许你可以将它的缓存值存储在另一个集合中,然后在服务器上进行计算。通过这种方式,你可以让它都是被动的&不必太担心计算的大小?