Avi*_*hai 3 mapreduce ruby-on-rails mongodb mongoid mongodb-query
我正在迁移现有的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...
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何在Mongoid中做到这一点?该模型非常简单:
class Conversion
include Mongoid::Document
include Mongoid::Timestamps
field :amount, :type => Float, :default => 0.0
...
# created_at generated automatically, standard Rails...
end
Run Code Online (Sandbox Code Playgroud)
谢谢!
-Avishai
不幸的是,它比你想象的要难一点.
我的理解是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};};"
Run Code Online (Sandbox Code Playgroud)
然后map_reduce直接调用集合,在这种情况下:
Conversion.collection.map_reduce(map, reduce).find.to_a
Run Code Online (Sandbox Code Playgroud)
这将返回如下所示的哈希数组:
[{"_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}}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4228 次 |
| 最近记录: |