gpt4 book ai didi

ruby-on-rails - 使用 MongoDB/Mongoid 和计算字段聚合函数

转载 作者:可可西里 更新时间:2023-11-01 09:28:30 27 4
gpt4 key购买 nike

我正在迁移一个现有的 Rails 应用程序以使用 MongoDB(带有 Mongoid),但我在弄清楚如何像使用 MySQL 那样进行聚合时遇到了一些问题。

以前我有类似SELECT DATE(created_at) AS day, SUM(amount) AS amount GROUP BY day,它会返回一个集合,你可以像这样在模板中循环:

:day => '2011-03-01', :amount => 55.00 
:day => '2011-03-02', :amount => 45.00
etc...

有谁知道如何在 Mongoid 中做到这一点?该模型非常简单:

class Conversion
include Mongoid::Document
include Mongoid::Timestamps

field :amount, :type => Float, :default => 0.0
...
# created_at generated automatically, standard Rails...
end

谢谢!

-阿维夏

最佳答案

不幸的是,这比您想象的要难一些。

我的理解是 Mongoid 本身不支持在一个查询中进行分组和添加,为此您需要直接使用 MongoDB 驱动程序进行映射/归约。我用与您所拥有的类似的数据结构运行了这个示例,但在翻译过程中可能会出现一些错误,如果您有任何问题,请告诉我,我会尽力修改。

首先您需要定义您的 map 和 reduce 函数。这些必须存储为 JavaScript 字符串。

map = "function(){ emit(new Date(this.created_at.getYear(), this.created_at.getMonth(), this.created_at.getDate()), {amount: this.amount}); };"
reduce = "function(key, values){ var sum = 0; values.forEach(function(doc){ sum += doc.amount; }); return {amount: sum};};"

然后直接在集合上调用 map_reduce,在这种情况下:

Conversion.collection.map_reduce(map, reduce).find.to_a

这将返回如下所示的哈希数组:

[{"_id"=>Sat Dec 13 13:00:00 UTC 0110, "value"=>{"amount"=>55.0}}, {"_id"=>Sat Jan 17 13:00:00 UTC 0111, "value"=>{"amount"=>45.0}}] 

关于ruby-on-rails - 使用 MongoDB/Mongoid 和计算字段聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5417720/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com