動かざることバグの如し

3分経てば忘れそうなことをメモします

Twitterクライアントの使用率を集計してみる


Twitterクライアントの「ホワイトリスト」なるものをつくろうと思ってデータベースに集計させようとしたら、MongoDBだと一発でできるとのこと。

これはやるしかないと思ってやってみた

使うもの

  • TweetStream
  • MongoDB 3.0

ポイント

その1

集計するにあたって、まずActiveRecordでいうupdate_or_createなるものが必要である。つまりこれから加算する対象がすでにあれば+1、なければ作って=1にしなくてはならない。それをMongoDBはupsert: trueをつけるだけで実現できる。

その2

加算していくので一旦値を取り出して1足して格納かと思ったら、MongoDBだと$incという素晴らしい機能があるじゃん。使おう 結果

@col.update(
    {source: source},
    {:$inc => { count: 1}},
    {upsert: true}
)

のようになる

app.rb

require 'bundler'
Bundler.require

TweetStream.configure do |config|
    config.consumer_key = ""
    config.consumer_secret      = ""
    config.oauth_token = ""
    config.oauth_token_secret = ""
    config.auth_method = :oauth
end

db = Mongo::Connection.new.db('twitter')
@col = db.collection('via')

TweetStream::Client.new.sample do |tweet|
    if(tweet.lang == "ja")
        source = tweet.source.gsub(/<[^>]+>/, '')
        p source
        @col.update(
            {source: source},
            {:$inc => { count: 1}},
            {upsert: true}
        )
    end
end

Gemfile

# A sample Gemfile
source "https://rubygems.org"

gem "mongo"
gem "bson_ext"
gem "tweetstream"

参考

$incは載ってないけどクエリあたりは以下のサイトがめっちゃ詳しい

mongodbのクエリー使ってみるテスト(insert、update($set,$setOnInsert,multi,upsert)、saveとか) - tweeeetyのぶろぐ的めも