1

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

有什么建议么?

4

2 回答 2

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

然后我查询了数据库:

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

我刚刚测试了parseFloatin mongo 客户端并且它可以工作,所以这个 map/reduce 也应该可以工作。

于 2014-01-23T10:25:21.797 回答
-1

BigDecimal对 Mongoid 中的字段求和,请使用以下块形式#sum

sum = 0 Project.first.subprojects.sum do |subproject| sum += subproject.subtotal end

于 2014-08-15T10:16:13.230 回答