在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