Итерация по курсорам Монго более одного раза с использованием ruby - PullRequest
1 голос
/ 03 апреля 2012

Только что начал играть с MongoDB.

irb(main):037:0> @db.insert({"color" => "Blue"})
=> BSON::ObjectId('4f7aaf3a1d41c81634000002')

Теперь я пытаюсь использовать метод find, после использования find_one:

irb(main):039:0> @results = @db.find({"color" => "Blue"})
=> <Mongo::Cursor:0x4340c48 namespace='tutorial.users' @selector={"color"=>"Blue"} @cursor_id=>

Теперь я пытаюсь повторить результаты:

irb(main):040:0> @results.each do |aa|
irb(main):041:1* puts aa["color"]
irb(main):042:1> end
Blue
=> nil

Когда я запускаю его снова, ничего не появляется

irb(main):043:0> @results.each do |aa|
irb(main):044:1* puts aa["color"]
irb(main):045:1> end
=> nil

Возможно ли дважды повторить курсор монго?

Пост выше говорит, что я должен использовать перемотку!метод в классе ruby.

Давайте посмотрим:

irb(main):046:0> @results.rewind!
=> true
irb(main):047:0> @results.each do |aa|
irb(main):048:1* puts aa["color"]
irb(main):049:1> end
Blue
=> nil

Почему курсор подходит только для одного прогона?

Если я строилПриложение rails использует драйвер ruby ​​direct и пробует нумерацию страниц, когда кто-то нажимает кнопку «Назад», ничего не будет работать.

Есть другие варианты, но похоже на взлом.

Я прочиталгде-то на 10-минутном ограничении, но это, кажется, хорошо для одного использования?

Что здесь происходит, и почему я не могу повторить его снова, по крайней мере, под 10-минутным ограничением сервера

1 Ответ

2 голосов
/ 03 апреля 2012

Повторять итерацию по курсору означает снова отправлять запрос в MongoDB. Курсор не хранит все результаты запроса локально. Это будет очень неэффективно и может привести к неточностям (например, не отражать последние записи).

Как правило, при разбивке на страницы вы создаете отдельный запрос (или новый курсор) для каждой страницы, которую хотите отобразить, используя пропуск и ограничение. В этом нет ничего хакерского. В любом случае, объект курсора не будет сохраняться между запросами, поэтому вы все равно должны каждый раз создавать новый курсор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...