2013-10-09 4 views
0

Создал небольшое приложение, чтобы захватить твиты от политических кандидатов на предстоящие выборы. Использование Ruby, Twitterstream, Mongodb и Heroku.Mongodb не вставляет Ruby time.новоново на 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 

ответ

1

Проблема в том, что вам нужно использовать время UTC, а не ваш часовой пояс. Это не проблема MongoDB или Ruby, это ограничение спецификации BSON и типа ISODate BSON.

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

Кроме того, только хорошая практика, хотя.

Общее слово совета: используйте UTC на заднем конце того, что вы строите всегда в любом случае, независимо от того, какой хранилище данных вы используете (не специфическая вещь MongoDB). Это особенно верно, если эти данные - это то, что вы хотите запросить напрямую.

Если вам нужно преобразовать в локальный часовой пояс, лучше всего его обработать, когда вы показываете или выводите данные, а не пытаетесь управлять этим в другом месте. Некоторые из самых фантастических ошибок, которые я когда-либо видел, были связаны с непоследовательной обработкой часовых поясов на уровне персистентности приложения.

Держите эти времена согласованными на оборотной стороне и решайте локальное изменение часового пояса, когда в вашем приложении и жизнь будет намного проще для вас.

Вот примеры того, как работать со временем в MongoDB используя Ruby:

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

Смежные вопросы