Dea*_*ean 1 mongoid ruby-on-rails-3
Mongoid 3 文档显示您可以使用以下内容进行简单的求和: Band.sum(:likes)
我有以下简单模型:
class Project
...
has_many :subprojects
...
end
class Subproject
...
field :subtotal, :type => BigDecimal, :default => 0
...
end
Run Code Online (Sandbox Code Playgroud)
我如何总结subtotal每个Project?
例如,我试过
Project.first.subprojects.sum(:subtotal) 它返回 0。
但
Project.first.subprojects.first.subtotal返回#<BigDecimal:7fcb0d77b958,'0.11054E3',18(18)>
有什么建议?
我测试了 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
Run Code Online (Sandbox Code Playgroud)
然后我查询了数据库:
> db.tests.find()
{ "_id" : ObjectId("52e0ed4bb2e8c9ea34000001"), "decimal" : "123.0" }
Run Code Online (Sandbox Code Playgroud)
您清楚地看到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)
Run Code Online (Sandbox Code Playgroud)
我刚刚测试了parseFloatin mongo 客户端并且它可以工作,所以这个 map/reduce 也应该可以工作。
| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |