嵌入式文档中的Mongoid聚合方法?

时间:2012-02-20 19:29:54

标签: mongodb mongoid aggregation-framework

如何在嵌入式文档上运行聚合,最小值,最大值,总和and friends

例如:

获取某个地区所有活动的平均费用,这些活动非常深入。

District.schools.all.events.all.costs.avg(:value)

显然不起作用。

District.avg('schools.events.costs.value')

也不是这样。 它给出了以下错误消息:

Mongo::OperationFailure: Database command 'group' failed: (errmsg: 'exception: reduce
invoke failed: JS Error: TypeError: obj.schools 
has no properties reduce setup:1'; code:   '9010'; ok: '0.0').

那么可能还是我需要编写自己的map / reduce函数?

1 个答案:

答案 0 :(得分:2)

是的,MapReduce可行。您还可以使用游标来处理查询结果。像:

min = 99999999;
max = -99999999;
sum = 0;
count = 0
db.School.find({}).forEach(function(s) {
    if (s.first.events.first.cost < min)
        min = s.first.events.first.cost;
    if (s.first.events.first.cost > max)
        max = s.first.events.first.cost;
    sum += s.first.events.first.cost;
    ++count;
});

您现在拥有最小值和最大值,可以计算总和和计数的平均值和平均值。

Mongodb无法直接在其查询语言中计算聚合函数。实际上,该语句并不完全正确,因为有count()函数来计算查询返回的结果数,并且有group()函数。但是组功能很像MapReduce,不能用于分片数据库。如果您对组功能感兴趣,请参阅:http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group