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 回答