我試圖從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 hsh
到return hsh
,p 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
謝謝,它確實解決了返回值問題,但是當我使用'map'時,它將返回一個數組而不是一個散列,結果如下所示:'[{:response => {:version =>「 1.1「,::statusCode => 302,.......]',無法插入彈出式對話框中,正確的應該是這樣的:'{:response => {:version =>」1.1「,: statusCode => 302,.......'沒有[],我該如何解決這個問題? – roccia
好吧,似乎你想擁有一個數組,因爲你有多個結果?所以,你可以: *使用前/後/ ...結果的列表:嘗試'''.first''','''.last'''或'''[some_index]'' ' *遍歷結果數組並插入每個項目分爲ES *找到一種方法,在一次其實我需要一個散列,也許一個哈希表,原因'體ES –
添加多個結果:'只有ES-紅寶石API以散列作爲參數,我得到的結果是一個數組,它有全部10個條目,現在我想我需要找到一種方法來讓'mongoConn'方法返回一個散列。我有60000個條目,所以它可能不是一個好主意,循環每一個,對吧? – roccia