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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值