Mongo-запрос с использованием mongoid в приложении rails, вызывающий ошибку тайм-аута курсора

У меня есть запрос 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 без предварительного выключения курсора?

Спасибо

Ответ 1

То, что вы хотите, - установить время ожидания курсора на false, когда вы запрашиваете mongodb.

Вот что вы можете сделать с mongoid 3:

FbCheckin.where(...).no_timeout.each do |fb_checkin|
  "do something with fb_checkin"
end

Ответ 2

Используйте параметр 'no_cursor_timeout' и запрос поиска при использовании драйвера Mongo Ruby.

Это отключит все таймауты курсора. По умолчанию MongoDB пытается убить все курсоры, которые были неактивны более 10 минут.

Более подробную информацию можно найти здесь.

Ответ 3

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