2016-02-15 203 views
0

我試圖從mongodb中提取數據給Elasticsearch,getMongodoc = coll.find().limit(10) 會在mongo中找到前10個條目。如何將變量從一個類傳遞到ruby中的另一個類

如您所見,result = ec.mongoConn應從類MongoConnector中的方法mongoConn()得到結果。當我用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 hshreturn 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

您正在調用迴路(each)。這將停止循環並返回第一個結果。嘗試是這樣的:

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

注:

  • 在Ruby中,你通常不需要關鍵字作爲自動返回的最後一個值。通常你會使用回報防止一些代碼
  • 在紅寶石snake_case用於變量和方法的名稱(而不是首字母大寫或駝峯)正在執行
  • 地圖枚舉一個集合(通過調用每塊項),並返回一個與該塊的返回值相同大小的新集合。
  • 你不需要空括號()方法上定義

UPDATE:

  • 通過MongoDB中返回的數據結構是一個Hash(BSON是一種特殊的序列化)。哈希是指向值的鍵(「_id」,「response」)的集合。您在評論中指出的差異是散列鍵的類別:字符串與符號
  • 對於您的情況,Mongo中的文檔表示爲散列,每個文檔散列一個散列
  • 如果要返回多個文檔,那麼需要一個數組。更具體地說散列的數組:[{}, {}, ...]
  • 如果你的目標(ES)在同一時間也只能接受一個哈希值,那麼你將需要循環從蒙戈的結果,並通過一個將它們添加一個:

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

+0

謝謝,它確實解決了返回值問題,但是當我使用'map'時,它將返回一個數組而不是一個散列,結果如下所示:'[{:response => {:version =>「 1.1「,::statusCode => 302,.......]',無法插入彈出式對話框中,正確的應該是這樣的:'{:response => {:version =>」1.1「,: statusCode => 302,.......'沒有[],我該如何解決這個問題? – roccia

+0

好吧,似乎你想擁有一個數組,因爲你有多個結果?所以,你可以: *使用前/後/ ...結果的列表:嘗試'''.first''','''.last'''或'''[some_index]'' ' *遍歷結果數組並插入每個項目分爲ES *找到一種方法,在一次其實我需要一個散列,也許一個哈希表,原因'體ES –

+0

添加多個結果:'只有ES-紅寶石API以散列作爲參數,我得到的結果是一個數組,它有全部10個條目,現在我想我需要找到一種方法來讓'mongoConn'方法返回一個散列。我有60000個條目,所以它可能不是一個好主意,循環每一個,對吧? – roccia

相關問題