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のぶろぐ的めも