Mongoid 3文档显示您可以使用以下内容进行简单求和:Band.sum(:likes)
我有以下简单模型:
class Project
...
has_many :subprojects
...
end
class Subproject
...
field :subtotal, :type => BigDecimal, :default => 0
...
end
如何在每个subtotal
中汇总Project
?
例如,我试过
Project.first.subprojects.sum(:subtotal)
它返回0.
但是
Project.first.subprojects.first.subtotal
返回#<BigDecimal:7fcb0d77b958,'0.11054E3',18(18)>
有什么建议吗?
答案 0 :(得分:4)
我测试了Mongoid如何存储BigDecimal
:
rails c
:
class Test
include Mongoid::Document
field :decimal, type: BigDecimal
end
test = Test.new
test.decimal = BigDecimal.new(123, 456)
test.save
然后我查询了数据库:
> db.tests.find()
{ "_id" : ObjectId("52e0ed4bb2e8c9ea34000001"), "decimal" : "123.0" }
您清楚地看到BigDecimal
存储为字符串,从而解释了为什么您不能sum
它。
但是,您可以尝试解析它,然后使用map / reduce总结它:
map = %Q{
function() {
emit("BigDecimalSum", { decimal: parseFloat(this.decimal) });
}
}
reduce = %Q{
function(key, values) {
var result = { sum: 0 };
values.forEach(function(value) {
result.sum += value.decimal;
});
return result;
}
}
Test.map_reduce(map, reduce).out(inline: true)
我只是测试了mongo客户端中的parseFloat
并且它有效,所以这个map / reduce也应该有用。
答案 1 :(得分:-1)
要对Mongoid中的BigDecimal
字段求和,请使用#sum
的块形式:
sum = 0
Project.first.subprojects.sum do |subproject|
sum += subproject.subtotal
end