Ответ 1
То, что вы хотите, - установить время ожидания курсора на false, когда вы запрашиваете mongodb.
Вот что вы можете сделать с mongoid 3:
FbCheckin.where(...).no_timeout.each do |fb_checkin|
"do something with fb_checkin"
end
У меня есть запрос mongo в моем приложении rails, который синхронизируется, потому что коллекция огромна.
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
без предварительного выключения курсора?
Спасибо
То, что вы хотите, - установить время ожидания курсора на false, когда вы запрашиваете mongodb.
Вот что вы можете сделать с mongoid 3:
FbCheckin.where(...).no_timeout.each do |fb_checkin|
"do something with fb_checkin"
end
Используйте параметр 'no_cursor_timeout' и запрос поиска при использовании драйвера Mongo Ruby.
Это отключит все таймауты курсора. По умолчанию MongoDB пытается убить все курсоры, которые были неактивны более 10 минут.
Более подробную информацию можно найти здесь.
mongoid по умолчанию убьет долговременный запрос, а затем поднимет эту ошибку
вы можете изменить параметр raise_not_found_error в файле mongoid.yml, чтобы избежать этой ошибки.
например:
production:
sessions:
default:
database: local
hosts:
- localhost:27017
options:
allow_dynamic_fields: true
raise_not_found_error: false