tom*_*eng 5 ruby-on-rails mongodb mongoid
我有一个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
Run Code Online (Sandbox Code Playgroud)
我一次处理大约100K的记录.不幸的是,在20分钟,我收到一个Query response returned CURSOR_NOT_FOUND错误.
mongodb faq说使用skip和/ limit或关闭超时,使用它们所有东西大约慢2-3倍.
如何与mongoid一起关闭超时?
在MongoDB的文档说,你可以在超时布尔通,而且超时是假的,它永远不会超时
collection.find({"type" => "a"}, {:timeout=>false})
Run Code Online (Sandbox Code Playgroud)
在你的情况下:
Record.collection.find({:type=>'a'}, :timeout => false).each ...
Run Code Online (Sandbox Code Playgroud)
我还建议您使用Mongo查看map-reduced.它似乎是对这种集合数组操作进行了调整:http://www.mongodb.org/display/DOCS/MapReduce
在mongoid 3中你可以使用这个:
ModelName.all.no_timeout.each do |m|
"do something with model"
end
Run Code Online (Sandbox Code Playgroud)
这非常方便.
看起来,至少现在,您必须通过Mongo驱动程序进行漫长的路径和查询:
Mongoid.database[collection.name].find({ a_query }, { :timeout => false }) do |cursor|
cursor.each do |row|
do_stuff
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |