首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Mongoid BigDecimal求和

对Mongoid BigDecimal求和
EN

Stack Overflow用户
提问于 2013-05-31 18:43:06
回答 2查看 891关注 0票数 1

Mongoid3文档显示,您可以使用以下内容进行简单的求和:Band.sum(:likes)

我有以下几个简单的模型:

代码语言:javascript
复制
class Project
  ...
  has_many :subprojects
  ...
end

class Subproject
  ...
  field :subtotal, :type => BigDecimal, :default => 0
  ...
end

如何对每个Projectsubtotal求和

例如,我试过

Project.first.subprojects.sum(:subtotal)它返回0。

但是Project.first.subprojects.first.subtotal返回#<BigDecimal:7fcb0d77b958,'0.11054E3',18(18)>

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2014-01-23 18:25:22

我测试了Mongoid如何存储BigDecimal

rails c

代码语言:javascript
复制
class Test
  include Mongoid::Document
  field :decimal, type: BigDecimal
end
test = Test.new
test.decimal = BigDecimal.new(123, 456)
test.save

然后我查询了数据库:

代码语言:javascript
复制
> db.tests.find()
{ "_id" : ObjectId("52e0ed4bb2e8c9ea34000001"), "decimal" : "123.0" }

您可以清楚地看到,BigDecimal是以字符串的形式存储的,这就解释了为什么不能sum它。

但是,您可以尝试解析它,然后使用map/reduce对其求和:

代码语言:javascript
复制
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也应该可以工作。

票数 5
EN

Stack Overflow用户

发布于 2014-08-15 18:16:13

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16855435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档