在rails应用程序中使用mongoid进行Mongo查询导致游标超时错误

时间:2013-02-08 00:03:36

标签: ruby-on-rails mongodb mongoid

我在我的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而不事先将光标超时?

由于

3 个答案:

答案 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