【问题标题】:Mongodb not inserting Ruby time.new consistantly on HerokuMongodb没有在Heroku上一致地插入Ruby time.new
【发布时间】:2013-10-17 00:47:15
【问题描述】:

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

【问题讨论】:

    标签: ruby mongodb heroku tweetstream


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2012-07-13
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多