Mongoid3文档显示,您可以使用以下内容进行简单的求和:Band.sum(:likes)
我有以下几个简单的模型:
class Project
...
has_many :subprojects
...
end
class Subproject
...
field :subtotal, :type => BigDecimal, :default => 0
...
end如何对每个Project的subtotal求和
例如,我试过
Project.first.subprojects.sum(:subtotal)它返回0。
但是Project.first.subprojects.first.subtotal返回#<BigDecimal:7fcb0d77b958,'0.11054E3',18(18)>
有什么建议吗?
发布于 2014-01-23 18:25:22
我测试了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也应该可以工作。
发布于 2014-08-15 18:16:13
要对Mongoid中的BigDecimal字段求和,可以使用#sum的块形式
sum = 0 Project.first.subprojects.sum do |subproject| sum += subproject.subtotal end
https://stackoverflow.com/questions/16855435
复制相似问题