首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MongoDB中使用tweetstream存储推文失败,错误如下

在MongoDB中使用tweetstream存储推文失败,错误如下
EN

Stack Overflow用户
提问于 2012-11-13 21:55:48
回答 3查看 1K关注 0票数 2

我刚刚开始学习ruby和mongodb的概念。这就是我尝试运行的脚本

代码语言:javascript
复制
require 'rubygems'
require 'tweetstream'
require 'mongo'

TweetStream.configure do |config|
  config.consumer_key = '<key>'
  config.consumer_secret = '<secret>'
  config.oauth_token = '<token>'
  config.oauth_token_secret = '<token_secret'
  config.auth_method = :oauth
end

connection = Mongo::Connection.new

db = connection.db("tweetsDB")

tweets = db.collection("tweets")

client = TweetStream::Client.new

client.on_error do |message|
  puts message
end

client.follow(<user_id>,<user_id>) do |status|
        id = tweets.insert(status, :safe => true)
end

注意:对于这篇文章,我已经删除了上面脚本中的所有静态私有值。

Mongo、bson、bson_ext版本- 1.7.0

错误消息

代码语言:javascript
复制
NoMethodError: undefined method `has_key?' for #<Twitter::Tweet:0x7f21cd14cf08>
    /var/lib/gems/1.8/gems/bson-1.7.0/lib/bson/types/object_id.rb:93:in `create_pk'
    /var/lib/gems/1.8/gems/mongo-1.7.0/lib/mongo/collection.rb:360:in `insert'
    /var/lib/gems/1.8/gems/mongo-1.7.0/lib/mongo/collection.rb:360:in `collect!'
    /var/lib/gems/1.8/gems/mongo-1.7.0/lib/mongo/collection.rb:360:in `insert'
    tracker.rb:28
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:525:in `call'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:525:in `invoke_callback'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:533:in `yield_message_to'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:471:in `respond_to'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:411:in `connect'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:296:in `call'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:296:in `invoke_callback'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:143:in `handle_stream'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:193:in `on_body'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:192:in `each'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:192:in `on_body'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:74:in `<<'
    /var/lib/gems/1.8/gems/em-twitter-0.2.1/lib/em-twitter/connection.rb:74:in `receive_data'
    /var/lib/gems/1.8/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run_machine'
    /var/lib/gems/1.8/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:385:in `start'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:128:in `filter'
    /var/lib/gems/1.8/gems/tweetstream-2.3.0/lib/tweetstream/client.rb:106:in `follow'
    tracker.rb:27
EN

回答 3

Stack Overflow用户

发布于 2013-05-20 21:38:46

如果您想盲目地将所有内容都转储到MongoDB中,那么只需执行以下操作:

代码语言:javascript
复制
client.follow(<user_id>,<user_id>) do |status|
  data = status.to_hash
  id = tweets.insert(data)
end

如果你想变得更有选择性,那么你可以试着这样做:

代码语言:javascript
复制
# only add the following fields to the database
ONLY = %w{created_at text geo coordinate id_str}

client.follow(<user_id>,<user_id>) do |status|
  data = status.to_hash.select{|k,v| ONLY.include?(k.to_s)}
  id = tweets.insert(data)
end

或者:

代码语言:javascript
复制
# add everything except the following fields to the database
EXCEPT = %w{entities}

client.follow(<user_id>,<user_id>) do |status|
  data = status.to_hash.reject{|k,v| EXCEPT.include?(k.to_s)}
  id = tweets.insert(data)
end
票数 2
EN

Stack Overflow用户

发布于 2012-11-13 23:10:56

docs来看,Client.follow只返回一个通用的ruby对象。您必须从对象中提取相关字段,并将它们提取到json (或者,更明智的做法是mongoid对象)中,以发送到数据库。

票数 0
EN

Stack Overflow用户

发布于 2013-03-12 04:35:19

has_key?是Hash超类中可用的方法。它试图做的是制作一个json字符串来传递给Mongo。除了你在传递一个字符串,has_key?不是String类的一部分。只需将其转换为哈希,您就应该可以运行了。

代码语言:javascript
复制
client.follow(<user_id>,<user_id>) do |status|
    id = tweets.insert({:status => status.text}, :safe => true)
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13362001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档