如何将类中的变量传递给ruby中的另一个类

时间:2016-02-15 09:28:27

标签: ruby

我正在尝试将数据从mongodb提取到Elasticsearch,getMongodoc = coll.find().limit(10) 将在mongo中找到前10个条目。

如您所见,result = ec.mongoConn应该从类mongoConn()中的方法MongoConnector获得结果。当我使用p hsh(检查输出是否正确)时,它将打印10个entires,而p result = ec.mongoConn将打印#<Enumerator: #<Mongo::Cursor:0x70284070232580 @view=#<Mongo::Collection::View:0x70284066032180 namespace='mydatabase.mycollection' @filter={} @options={"limit"=>10}>>:each>

我将p hsh更改为return hshp result = ec.mongoConn将获得正确的结果,但它只打印第一个条目而不是所有10个条目。似乎hsh的值没有正确传递给result = ec.mongoConn,有谁能告诉我我做错了什么?这是因为我在方法调用方面做错了吗?

class MongoConncetor 
def mongoConn()
BSON::OrderedHash.new
client = Mongo::Client.new([ 'xx.xx.xx.xx:27017' ], :database => 'mydatabase')
coll = client[:mycollection]
getMongodoc = coll.find().limit(10)

getMongodoc.each do |document|
  hsh = symbolize_keys(document.to_hash).select { |hsh| hsh != :_id }
     return hsh
    # p hsh
end

end


class ElasticConnector < MongoConncetor
include Elasticsearch::API

CONNECTION = ::Faraday::Connection.new url: 'http://localhost:9200'

def perform_request(method, path, params, body)
puts "--> #{method.upcase} #{path} #{params} #{body}"

CONNECTION.run_request \
  method.downcase.to_sym,
  path,
  ((
  body ? MultiJson.dump(body) : nil)),
  {'Content-Type' => 'application/json'}
 end


 ec = ElasticConnector.new

 p result = ec.mongoConn  

 client = ElasticConnector.new
 client.bulk index: 'myindex',
               type:'test' ,
               body: result
end

1 个答案:

答案 0 :(得分:1)

您正在循环中调用return(each)。这将停止循环并返回第一个结果。尝试类似:

getMongodoc.map do |document|
  symbolize_keys(document.to_hash).select { |hsh| hsh != :_id }
end

注意:

  • 在ruby中,您通常不需要 return 关键字,因为最后一个值会自动返回。通常,您使用return来阻止某些代码被执行
  • ruby中的
  • snake_case用于变量和方法名称(与CamelCase或camelCase相对)
  • map 枚举一个集合(通过为集合中的每个项目调用块)并返回一个相同大小的新集合以及块中的返回值。
  • 您在方法定义上不需要空白的()

更新:

  • MongoDB返回的数据结构是Hash(BSON是一种特殊的序列化)。哈希是一组指向值的键(&#34; _id&#34;,&#34;响应&#34;)。您在评论中指出的差异是散列键的类:字符串与符号
  • 在您的情况下,Mongo中的文档表示为Hash,每个文档一个哈希
  • 如果要返回多个文档,则需要一个数组。更具体地说是一组哈希:[{}, {}, ...]
  • 如果你的目标(ES)一次只接受一个哈希,那么你需要从mongo循环结果并逐个添加:

list_of_results = get_mongo_data list_of_results.each do |result| add_result_to_es(result) end