在rails app中使用mongoid的Mongo查询导致游标超时错误
我在我的rails应用程序中有一个mongo查询,因为该集合非常庞大。
FbCheckin.where(ext_fb_place_id: self.ext_fb_place_id).all
我从文档中读到,您可以添加一个timeout
选项,以防止光标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
而不事先将光标超时?
谢谢
你想要的是在查询mongodb时将光标超时设置为false。
这是你可以用mongoid 3做的:
FbCheckin.where(...).no_timeout.each do |fb_checkin| "do something with fb_checkin" end
使用Mongo Ruby Driver时,使用‘no_cursor_timeout’选项和查询查询。
这将禁用所有光标超时。 默认情况下,MongoDB会尝试终止所有已处于非活动状态超过10分钟的游标。
更多信息可以在这里找到。
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