2012-02-20 127 views
1

如何在嵌入式文档上运行汇总,最小值,最大值,总和and friends关于嵌入式文档的Mongoid聚合方法?

例如:

获取一个区都有,他们在那里相当深深嵌入所有事件的平均成本。

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的功能呢?

回答

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

+0

我已更新我的问题以更好地显示我之后的内容。 – Yeggeps 2012-02-20 20:14:06

+0

Mongodb查询语言无法计算聚合函数。您可以编写一个MapReduce,或者您可以像我在示例中演示的那样自行计算值,方法是遍历查询的返回值。有关查询语言的更多详细信息:http://www.mongodb.org/display/DOCS/Advanced+Queries – dlaidlaw 2012-02-20 20:53:13

+0

很酷,谢谢你的回答! – Yeggeps 2012-02-20 21:32:04

相关问题