Mongoid + RubyMoney

Mongoid + RubyMoney

我在 Mongoid 中使用 RubyMoney (money-rails) https://github.com/RubyMoney/money-rails。像这样:

class Order
  include Mongoid::Document
    field :order_amount, :type => Money, :default => Money.new(0)
    ...
end

如何在 Money 字段上进行聚合?例如,当我 运行 Order.sum(:order_amount) 时,即使该字段的值类似于 #<Money fractional:5500 currency:USD>,我也会得到 0。我也试过 Order.sum(:order_amount_cents) 和 returns 0.

这是生成的RubyMongoDB命令:

command={:aggregate=>"orders", :pipeline=>[{"$match"=>{"order_amount"=>{"$nin"=>[nil]}}}, {"$group"=>{"_id"=>"order_amount", "count"=>{"$sum"=>1}, "max"=>{"$max"=>"$order_amount"}, "min"=>{"$min"=>"$order_amount"}, "sum"=>{"$sum"=>"$order_amount"}, "avg"=>{"$avg"=>"$order_amount"}}}]} (2.4292ms)

我也尝试过将 moped 聚合命令与 Order.collection.aggregate 一起使用,但似乎也不起作用。

Order.collection.aggregate(
    { 
        '$group' => { 
            '_id' => '$order_amount', 
            'totalOrder' => { '$sum' => '$order_amount' }       
        }
    }
)

有什么帮助吗?

我刚刚添加了这个 here 的答案,但以防万一其他人像我一样来到这个 post,我能够使用一些东西来总结金钱 - rails 值像这样:

Order.sum("order_amount.cents")

这将 return 只是 Money-rails 结构中的美分值:

{ cents: < value >, currency_iso: < value > }

因此,为了获得金额 -rails 格式,您将使用:

Money.new(Order.sum("order_amount.cents"))

请注意,这是在使用 mongoid v3 时,因为 money-rails 是如何序列化的。 我相信对于以前版本的 mongoid,money-rails 对象是使用 "fractional" 而不是美分序列化的,所以你必须使用:

Money.new(Order.sum("order_amount.fractional"))

希望对您有所帮助!