2013-10-09 34 views
0

構建一個小應用程序,以便從即將到來的選舉的政治候選人處獲取推文。使用Ruby,Twitterstream,Mongodb和Heroku。Mongoku不會在Heroku上一直插入Ruby time.new

時間不正確地插入到數據庫中。有時它起作用,有時它不起作用。這是我的代碼,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

而且,雖然只是一個很好的做法。

建議的一般建議:不管你使用什麼數據存儲(不是MongoDB特定的東西),無論你使用的是什麼數據存儲,總是使用UTC的後端。如果這些數據是您想要直接查詢的內容,則尤其如此。

如果您需要轉換爲本地時區,則最好在顯示或輸出數據時處理該數據,而不是試圖在其他地方管理該數據。我見過的一些最奇妙的錯誤與應用程序持久層中時區的處理不一致有關。

保持這些時間的一致性,並且在應用程序中處理本地時區轉換,並且生活對您來說會更容易。

這裏是紅寶石如何與次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