Как я могу запросить mongodb, используя mongoid / rails без тайм-аута? - PullRequest
5 голосов
/ 26 октября 2010

У меня есть задача rake, которая обрабатывает набор записей и сохраняет его в другой коллекции:

batch = [] 

Record.where(:type => 'a').each do |r| 
  batch <<  make_score(r)

  if batch.size %100 == 0 
    Score.collection.insert(batch) 
    batch = [] 
  end 
end 

Я обрабатываю около 100 тысяч записей одновременно.К сожалению, через 20 минут я получаю ошибку Query response returned CURSOR_NOT_FOUND.

mongodb faq говорит, что нужно использовать skip и limit или отключать тайм-ауты, при их использовании все это примерно в 2-3 раза медленнее.

Как отключить тайм-ауты в сочетании с монгоидом?

Ответы [ 4 ]

9 голосов
/ 26 октября 2010

Документы MongoDB говорят, что вы можете передать логическое значение тайм-аута, и это время ожидания ложно, оно никогда не будет превышено

collection.find({"type" => "a"}, {:timeout=>false})

В вашем случае:

Record.collection.find({:type=>'a'}, :timeout => false).each ...

Я также рекомендую вам обратить внимание на уменьшенную карту с Монго.Похоже, что тейлер сделал с этим видом манипуляции с массивом коллекций: http://www.mongodb.org/display/DOCS/MapReduce

7 голосов
/ 15 ноября 2013

В mongoid 3 вы можете использовать это:

ModelName.all.no_timeout.each do |m|
   "do something with model"
end

Что очень удобно.

6 голосов
/ 27 января 2011

Кажется, на данный момент, по крайней мере, вам нужно пройти длинный путь и запросить через драйвер Mongo:

Mongoid.database[collection.name].find({ a_query }, { :timeout => false }) do |cursor| 
  cursor.each do |row| 
    do_stuff 
  end 
end
1 голос
/ 10 августа 2011

Вот обходной путь, который я сделал.Создайте массив для хранения полных записей и работайте с этим массивом, как этот

products = []

Product.all.each do |p|
products << p
end

products.each do |p|
# Do your magic
end

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

...