2013-05-31 35 views
1

Mongoid 3文檔顯示,你可以使用這樣的事情做簡單的算術:Band.sum(:likes)求和Mongoid的BigDecimal

我有以下簡單的模型:

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

有什麼建議?

回答

4

我測試商店BigDecimal如何Mongoid:

rails c

class Test 
    include Mongoid::Document 
    field :decimal, type: BigDecimal 
end 
test = Test.new 
test.decimal = BigDecimal.new(123, 456) 
test.save 

然後我queryed數據庫:

> db.tests.find() 
{ "_id" : ObjectId("52e0ed4bb2e8c9ea34000001"), "decimal" : "123.0" } 

你清楚地看到,BigDecimal存儲爲一個字符串,從而解釋爲什麼你不能sum它。


Howevery,你可以嘗試分析它,然後使用地圖概括/減少:

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) 

我剛剛測試儀蒙戈客戶端parseFloat和它的作品,所以這次的map/reduce也應該工作。

0

總結在Mongoid BigDecimal領域使用的#sum塊形式:

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

+0

這有沒有關係Mongoid,你可以使用任何ORM/ODM項目背後應該具有相同的行爲。至少試着只抓取你需要的領域。 – Geoffroy

+0

Geoffroy,我解釋你的評論是不必要的磨蝕。這個問題與Mongoid很相關,因爲Mongoid有一個內置的「總和」方法。 Dean在問「類似BigDecimal」的相似之處。確實,我的解決方案不依賴於Mongoid,但它仍然是對這個問題的有效答案。此外,這不是講授我只需要獲取所需字段的論壇;我直截了當地回答了一個直接的問題。 –

+0

Joost,我的評論並不意味着磨損,只是一個建議,如何改善你的答案,並使它更多的mongoid特定;) – Geoffroy