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

Huy*_*Huy 12 ruby-on-rails mongodb mongoid

我在我的rails应用程序中有一个mongo查询,因为该集合非常庞大.

FbCheckin.where(ext_fb_place_id: self.ext_fb_place_id).all
Run Code Online (Sandbox Code Playgroud)

我从文档中读到,您可以添加一个timeout选项,以防止光标超时,并显示以下消息:

Moped::Errors::CursorNotFound: The operation: "GET MORE" failed with error
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,包括

FbCheckin.where(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all
Run Code Online (Sandbox Code Playgroud)

FbCheckin.find(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all
Run Code Online (Sandbox Code Playgroud)

但这些都不会阻止光标超时.

有谁知道我怎么能做这个查询并收集所有FbCheckins没有光标超时事先?

谢谢

Que*_*tin 32

你想要的是在查询mongodb时将光标超时设置为false.

这是你可以用mongoid 3做的:

FbCheckin.where(...).no_timeout.each do |fb_checkin|
  "do something with fb_checkin"
end
Run Code Online (Sandbox Code Playgroud)

  • 我和@Huy有同样的问题.在后台任务中,我在更新db时迭代Object.all.更新来自挖掘Web数据,因此它在每个循环中都有一个提取延迟,以避免过于频繁的远程页面提取.这导致游标超时.@ Quentin的解决方案解决了这个问题.我将我的代码更改为```Object.all.no_timeout.each do | object |```并且它正在快速运行. (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
Run Code Online (Sandbox Code Playgroud)

  • “raise_not_found_error(true):当尝试通过不存在的 id 查找文档时,将引发 Mongoid::Errors::DocumentNotFound。设置为 false 时,同一查询只会返回 nil。” (2认同)