0

次の選挙の候補者からツイートを取得するための小さなアプリを作成しました。Ruby、Twitterstream、Mongodb、Heroku を使用しています。

時刻が矛盾してデータベースに挿入されています。うまくいくこともあれば、うまくいかないこともあります。これは私のコードですか、Heroku ですか、それとも Mongodb (Mongohq) ですか。サポートに関する質問があります。

働く

{
  _id: ObjectId("52556b5bd2d9530002000002"),
  time: ISODate("2013-10-09T14:42:35.044Z"),
  user: "Blondetigressnc",
  userid: 1342776674,
  tweet: "RT @GovBrewer: Mr. President @BarackObama, reopen America’s National Parks or let the states do it. #GrandCanyon #Lead http://t.co/kkPKt9B7…",
  statusid: "387951226866110464"
}

動作していません

{
  _id: ObjectId("52556c2454d4ad0002000016"),
  user: "PeterMcC66",
  userid: 1729065984,
  tweet: "@GovBrewer @Blondetigressnc @BarackObama Time to impeach surely?",
  statusid: "387952072223506432"
}

ランダムに見えます。私のコードに問題やばかげたことはありますか?

require 'rubygems'
require 'tweetstream'
require 'mongo'

# user ids 
users = 'list of Twitter user ids here'

# connect to stream
TweetStream.configure do |config|
  config.consumer_key       = ENV['T_KEY']
  config.consumer_secret    = ENV['T_SECRET']
  config.oauth_token        = ENV['T_TOKEN']
  config.oauth_token_secret = ENV['T_TOKEN_SECRET']
  config.auth_method        = :oauth
end

# connection to database
  if ENV['MONGOHQ_URL']
    uri = URI.parse(ENV['MONGOHQ_URL'])
    conn = Mongo::Connection.from_uri(ENV['MONGOHQ_URL'])
    DB = conn.db(uri.path.gsub(/^\//, ''))
  else
    DB = Mongo::Connection.new.db("tweetsDB")
  end

# creation of collections
tweets =  DB.create_collection("tweets")
deleted = DB.create_collection("deleted-tweets")


@client = TweetStream::Client.new

@client.on_delete do | status_id, user_id |
  puts "#{status_id}"
  timenow = Time.new
  id = status_id.to_s
  deleted.insert({ :time => timenow, :user_id => user_id, :statusid => id })
end

@client.follow(users) do |status|
  puts "[#{status.user.screen_name}] #{status.text}"
  timenow = Time.new
  id = status.id
  tweets.insert({ :time => timenow, :user => status.user.screen_name, :userid => status.user.id, :tweet => status.text, :statusid => id.to_s })
end
4

1 に答える 1

1

問題は、ローカル タイムゾーンではなく、UTC 時間を使用する必要があることです。これは MongoDB や Ruby ドライバーの問題ではなく、BSON 仕様と ISODate BSON タイプの制約です。

http://docs.mongodb.org/manual/reference/bson-types/#date
http://bsonspec.org/#/specification

また、良い習慣です。

一般的なアドバイス: 使用しているデータストア (MongoDB 固有のものではありません) に関係なく、構築するもののバックエンドでは常に UTC を使用してください。これは、このデータが直接クエリしたいものである場合に特に当てはまります。

ローカル タイムゾーンに変換する必要がある場合は、他の場所で管理しようとするのではなく、データを表示または出力するときにそれを処理することをお勧めします。私が今まで見た中で最も素晴らしいバグのいくつかは、アプリケーションの永続層でのタイムゾーンの一貫性のない処理に関連していました。

バックでこれらの時間を一定に保ち、アプリケーションでローカル タイムゾーンの変換に対処すると、作業がはるかに簡単になります。

Ruby を使用して MongoDB で時間を処理する方法の例を次に示します。

require 'time' # required for ISO-8601
require 'mongo'

include Mongo
client = MongoClient.new
coll   = client['example_database']['example_collection']

coll.insert({ 'updated_at' => Time.now.utc })

doc = coll.find_one()

doc['updated_it'].is_a?(Time)                     #=> true
doc['updated_at'].to_s                            #=> "2013-10-07 22:43:52 UTC"
doc['updated_at'].iso8601                         #=> "2013-10-07T22:43:52Z"
doc['updated_at'].strftime("updated at %m/%d/%Y") #=> "updated at 10/07/2013"

これの要点をここで入手できます:
https://gist.github.com/brandonblack/6876374

于 2013-12-04T06:27:02.980 に答える