求和 Mongoid BigDecimal

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)>

有什么建议?

Geo*_*roy 5

我测试了 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 也应该可以工作。