Mongodb没有在Heroku上一致地插入Ruby time.new

时间:2013-10-09 15:05:58

标签: ruby mongodb heroku tweetstream

建立一个小应用程序,以便从即将举行的选举中获取政治候选人的推文。使用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

1 个答案:

答案 0 :(得分: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