2016-08-02 32 views
2

我發現使用Ruby驅動程序從MongoDB的文件,將它們收集到陣列並重復他們來更新同一文件,如下面的代碼:蒙戈Ruby驅動程序遊標未發現錯誤

crawlarray = @@mongoclient[:crawlarray].find({searchresults:[]},:timeout => false).limit(500) 
crawlarray.each do |elm| 
    finalsearchstring = elm['searchstring'] 
    if elm["searchresults"].blank? 
     ap "SEARCHING: #{finalsearchstring}" 
     results = searchG(finalsearchstring) 
     elm["searchresults"] = results 
     @@mongoclient[:crawlarray].update_one({"_id" => elm['_id']}, elm) 
    else 
     ap "ALREADY SEARCHED: #{finalsearchstring}" 
    end 
end 

有90K的記錄,但正如你所看到的,我只是得到500以避免出現錯誤。每次經過大約150次迭代後,我都會得到這個錯誤;

D, [2016-08-02T22:32:08.853065 #10098] DEBUG -- : MONGODB | 127.0.0.1:27017 | posluga-dev.getMore | FAILED | Cursor not found, cursor id: 463388278686 (43) | 0.008009s 
/Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/operation/result.rb:256:in `validate!': Cursor not found, cursor id: 463388278686 (43) (Mongo::Error::OperationFailure) 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/operation/executable.rb:36:in `block in execute' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/server/connection_pool.rb:107:in `with_connection' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/server/context.rb:63:in `with_connection' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/operation/executable.rb:34:in `execute' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/cursor.rb:163:in `block in get_more' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/retryable.rb:51:in `call' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/retryable.rb:51:in `read_with_retry' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/cursor.rb:162:in `get_more' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/cursor.rb:88:in `each' 
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/collection/view/iterable.rb:44:in `each' 

有人能幫我解決嗎?

+0

也許這個答案有幫助:http://stackoverflow.com/a/19987687基本上增加一個'.no_timeout'提取像'FbCheckin.where(...)。no_timeout.each' – Miguelgraz

回答

2

使用'no_cursor_timeout'選項以及使用Mongo Ruby Driver時的find查詢。

這將禁用所有光標超時。默認情況下,MongoDB試圖殺死所有已經停用超過10分鐘的遊標。 欲瞭解更多信息,請查閱post