12

我的 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没有光标提前超时的情况下收集所有信息?

谢谢

4

3 回答 3

32

您想要的是在查询 mongodb 时将游标超时设置为 false。

这是您可以使用 mongoid 3 执行的操作:

FbCheckin.where(...).no_timeout.each do |fb_checkin|
  "do something with fb_checkin"
end
于 2013-11-14T20:27:48.723 回答
2

在使用Mongo Ruby 驱动程序时,将“no_cursor_timeout”选项与查找查询一起使用。

这将禁用所有游标超时。默认情况下,MongoDB 会尝试杀死所有处于非活动状态超过 10 分钟的游标。

更多信息可以在这里找到。

于 2017-02-23T13:13:42.150 回答
-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
于 2013-03-04T05:18:38.760 回答