我在我的rails应用程序中有一个mongo查询超时,因为该集合非常庞大。
FbCheckin.where(ext_fb_place_id: self.ext_fb_place_id).all
我从文档中读到,您可以添加timeout
选项,以防止光标超时,并显示以下消息:
Moped::Errors::CursorNotFound: The operation: "GET MORE" failed with error
我尝试了几种方法,包括
FbCheckin.where(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all
和
FbCheckin.find(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all
但这些都不会阻止光标超时。
有没有人知道如何进行此查询并收集所有FbCheckins
而不事先将光标超时?
由于
答案 0 :(得分:31)
你想要的是在查询mongodb时将光标超时设置为false。
以下是你可以用mongoid 3做的事情:
FbCheckin.where(...).no_timeout.each do |fb_checkin|
"do something with fb_checkin"
end
答案 1 :(得分:2)
在使用Mongo Ruby Driver时,使用' no_cursor_timeout' 选项以及查询查询。
这将禁用所有光标超时。默认情况下,MongoDB会尝试终止所有已处于非活动状态超过10分钟的游标。
可以找到更多信息here。
答案 2 :(得分:-3)
mongoid默认会终止长时间查询,然后引发此错误
您可以更改mongoid.yml中的raise_not_found_error选项以避免此错误
例如:
production:
sessions:
default:
database: local
hosts:
- localhost:27017
options:
allow_dynamic_fields: true
raise_not_found_error: false