首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

mongoid 干sum和group by工作

2012-09-02 
mongoid 做sum和group by工作参考了:http://www.dixis.com/?p531 http://mongoid.org/docs/querying/crit

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

热点排行