mongoid 做sum和group by工作
参考了:http://www.dixis.com/?p=531
http://mongoid.org/docs/querying/criteria.html
?
在网站的日常管理中,我们经常需要统计网站数据,比如每天的注册人数,每天上线人数,每天发贴人数,每天帖子数目
所以我们也就经常写些这样的语句:
Post.count :all, :conditions => ["created_at >= ? and created_at <= ? )", @start, @end], :group => 'date(created_at)'
来统计。
?这样的语句得到的结果是类型为 ActiveSupport::OrderedHash的数据。
其实用mongo and mongoid来做这样的事情也是比较容易的。
首先mongoid没有提供group by的功能,但是mongo有这样的功能。
?
conditions = Post.where(:created_at.gte => @start,:created_at.lte => @end).selector temp_results = Notification.collection.group(:keyf => "function(doc) { d = new Date(doc.created_at); return {created_at: d.toLocaleDateString() }; }", :initial => { :count => 0 }, :reduce => "function(doc,prev) { prev.count += +1; }", :cond => conditions)
?这样得到的temp_results是这样的数据
[#<BSON::OrderedHash:0x-24e6305e {"created_at"=>"03/12/2012", "count"=>2.0}>]
?首先是一个数组,数组里面是一个hash。那么要想得到类型为ActiveSupport::OrderedHash的数据。
可以这样再处理一下
@stats = ActiveSupport::OrderedHash.new temp_results.each do |result| @stats[result['created_at']] = result["count"] end