要实现的功能大致是:统计几个 collection 中的数据,整合然后列出 问题是:如何在 rails 中读取这些 collection 中的数据
如果只是简单的 count,而且这几个 collection 要统计的数据结构都是一致的,推荐使用我正在开发的面向 ActiveRecord 和 Mongoid 统计分析的 gem 包 statlysis,项目地址在:https://github.com/eoecn/statlysis
使用方法如下:
批量初始化 model 和表结构
{'07' => 1..31, '08' => 1..12}.map do |month, day_range|
day_range.map do |day|
# define model dynamically, e.g. MultipleLog20130729
date_str = "2013#{month}#{day.to_s.rjust(2, '0')}"
collection_class_name = "MultipleLog#{date_str}"
collection_name = collection_class_name.sub("MultipleLog", "multiple_log_")
eval("
class #{collection_class_name}
include Mongoid::Document
self.default_collection_name = #{collection_name.to_json}
field :t, :type => DateTime
field :url, :type => String
index({t: -1}, {:background => true})
end
")
end
end
简单的配置
Statlysis.setup do
set_database :statlysis
daily Mongoid[/eoe_logs_[0-9]+$/].where(:ui => {"$ne" => 0}), :time_column => :t
end
访问和统计
[23] pry(#<Statlysis::Configuration>)> Statlysis.daily['multi'].first
=> #<Statlysis::Timely:0x7fb9cc60a490 @is_activerecord=#<FalseClass:0x0>, @is_mongoid=#<TrueClass:0x4>, @is_orm=#<TrueClass:0x4>, @time_column=:t, @time_unit=:day, @time_zone=#<NilClass:0x8>, @multiple_dataset=#<Statlysis::MongoidDataset:0x7fb9cc67e840>, @stat_table_name="timely_multiplelog_d", @stat_model=#<Class:0x7fb9cc6116c8>, @output=#<Array:0x7fb9cc798118>>
[24] pry(#<Statlysis::Configuration>)> Statlysis.daily['multi'].first.output
=> [{:t=>Mon, 01 Jul 2013 00:00:00 +0000, :timely_c=>1, :totally_c=>1},
{:t=>Tue, 02 Jul 2013 00:00:00 +0000, :timely_c=>2, :totally_c=>3},
{:t=>Wed, 03 Jul 2013 00:00:00 +0000, :timely_c=>3, :totally_c=>6},
{:t=>Thu, 04 Jul 2013 00:00:00 +0000, :timely_c=>4, :totally_c=>10},
{:t=>Fri, 05 Jul 2013 00:00:00 +0000, :timely_c=>5, :totally_c=>15},
{:t=>Sat, 06 Jul 2013 00:00:00 +0000, :timely_c=>6, :totally_c=>21},
{:t=>Sun, 07 Jul 2013 00:00:00 +0000, :timely_c=>7, :totally_c=>28},
{:t=>Mon, 08 Jul 2013 00:00:00 +0000, :timely_c=>8, :totally_c=>36},
{:t=>Tue, 09 Jul 2013 00:00:00 +0000, :timely_c=>9, :totally_c=>45},
{:t=>Wed, 10 Jul 2013 00:00:00 +0000, :timely_c=>10, :totally_c=>55},
{:t=>Thu, 11 Jul 2013 00:00:00 +0000, :timely_c=>11, :totally_c=>66},
{:t=>Fri, 12 Jul 2013 00:00:00 +0000, :timely_c=>12, :totally_c=>78},
{:t=>Sat, 13 Jul 2013 00:00:00 +0000, :timely_c=>13, :totally_c=>91},
{:t=>Sun, 14 Jul 2013 00:00:00 +0000, :timely_c=>14, :totally_c=>105},
{:t=>Mon, 15 Jul 2013 00:00:00 +0000, :timely_c=>15, :totally_c=>120},
{:t=>Tue, 16 Jul 2013 00:00:00 +0000, :timely_c=>16, :totally_c=>136},
{:t=>Wed, 17 Jul 2013 00:00:00 +0000, :timely_c=>17, :totally_c=>153},
{:t=>Thu, 18 Jul 2013 00:00:00 +0000, :timely_c=>18, :totally_c=>171},
{:t=>Fri, 19 Jul 2013 00:00:00 +0000, :timely_c=>19, :totally_c=>190},
{:t=>Sat, 20 Jul 2013 00:00:00 +0000, :timely_c=>20, :totally_c=>210},
{:t=>Sun, 21 Jul 2013 00:00:00 +0000, :timely_c=>21, :totally_c=>231},
{:t=>Mon, 22 Jul 2013 00:00:00 +0000, :timely_c=>22, :totally_c=>253},
{:t=>Tue, 23 Jul 2013 00:00:00 +0000, :timely_c=>23, :totally_c=>276},
{:t=>Wed, 24 Jul 2013 00:00:00 +0000, :timely_c=>24, :totally_c=>300},
{:t=>Thu, 25 Jul 2013 00:00:00 +0000, :timely_c=>25, :totally_c=>325},
{:t=>Fri, 26 Jul 2013 00:00:00 +0000, :timely_c=>26, :totally_c=>351},
{:t=>Sat, 27 Jul 2013 00:00:00 +0000, :timely_c=>27, :totally_c=>378},
{:t=>Sun, 28 Jul 2013 00:00:00 +0000, :timely_c=>28, :totally_c=>406},
{:t=>Mon, 29 Jul 2013 00:00:00 +0000, :timely_c=>29, :totally_c=>435},
{:t=>Tue, 30 Jul 2013 00:00:00 +0000, :timely_c=>30, :totally_c=>465},
{:t=>Wed, 31 Jul 2013 00:00:00 +0800, :timely_c=>27, :totally_c=>483}]
[25] pry(#<Statlysis::Configuration>)>