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是这样的数据

[#"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

你可能感兴趣的:(mongoid,mongodb)