mongodbのMapReduceでUUを求めてみた

現在、e-NDEXのアクセスログは全部mongodbに入れてお手製のアクセス解析ツールでレポートしています。

最初はとりあえずパフォーマンス無視ということで全部データを取得してRubyで解析するという荒業に出てたんだけど、現状で65万行くらいなので既にかなり重い。7秒とかかかる。

これは微妙ということで、普通にmongoidのCriteriaAPIを使って集計しようとしたんだけど、groupの仕様がイマイチ使いづらい。というかtimestampは秒単位で登録してるので、日付毎のUUが集計できない。

 

という訳でMapReduce使ってゴリゴリ集計して見ることに。いきなりmongoidでやるのも大変そうなので、まずはコンソールからJSで書きました。

UUはいきなり計算せずに、まず日付毎のIPに集約して、それを一時コレクションに保存。そして、その一時コレクションに対して更に日付毎で集計する、という手順で求めています。

MapReduceを使うと自動的に一時コレクションが生成されるので、チェインができて便利。

しかし、問題はこの処理がやはり7秒程度かかるという事... どうもタイムスタンプを丸める処理で時間を使う模様。まあ、それを削っても3秒程度かかるので微妙だけど。
うーん、どうしたもんか。