Ruby on rails 使用mongodb在rails中进行批量更新

Ruby on rails 使用mongodb在rails中进行批量更新,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我有一个场景需要在mongodb中更新一些7k记录。问题是 Document.all.each do |d| d.pages_enabled_count = d.pages.where(:disabled => false).count d.pages_enabled_to_query_count = d.pages.where(:disabled => false , :to_query => true).count d.pages_enabled_to_rescan_cou

我有一个场景需要在mongodb中更新一些7k记录。问题是

Document.all.each do |d|
d.pages_enabled_count = d.pages.where(:disabled => false).count
d.pages_enabled_to_query_count = d.pages.where(:disabled => false , :to_query => true).count
d.pages_enabled_to_rescan_count = d.pages.where(:disabled => false , :to_rescan => true).count
d.pages_enabled_to_retag_count = d.pages.where(:disabled => false , :to_retag => true).count
d.save
end
看起来这个查询需要2个多小时!!一次更新大约需要1.6秒。优化这一点的方法是什么

MONGODB (388.3ms) test['$cmd'].find({"count"=>"pages", "query"=>{:deleted_at=>nil, 
"document_id"=>BSON::ObjectId('51cd1c435329b64899000035'), :disabled=>false}, "fields"=>nil}).limit(-1)
MONGODB (388.5ms) test['$cmd'].find({"count"=>"pages", "query"=>{:deleted_at=>nil, "document_id"=>BSON::ObjectId('51cd1c435329b64899000035'), :disabled=>false, :to_query=>true}, "fields"=>nil}).limit(-1)
MONGODB (408.0ms) test['$cmd'].find({"count"=>"pages", "query"=>{:deleted_at=>nil, "document_id"=>BSON::ObjectId('51cd1c435329b64899000035'), :disabled=>false, :to_rescan=>true}, "fields"=>nil}).limit(-1)
MONGODB (390.9ms) test['$cmd'].find({"count"=>"pages", "query"=>{:deleted_at=>nil, "document_id"=>BSON::ObjectId('51cd1c435329b64899000035'), :disabled=>false, :to_retag=>true}, "fields"=>nil}).limit(-1)
MONGODB (0.9ms) test['users'].find({"owned_document_id"=>BSON::ObjectId('51cd1c435329b64899000035')}).limit(-1).sort([[:_id, :asc]])
MONGODB (0.1ms) test['documents'].update({"_id"=>BSON::ObjectId('51cd1c435329b64899000035')}, {"$set"=>{"pages_enabled_count"=>18, "pages_enabled_to_query_count"=>0, "pages_enabled_to_rescan_count"=>0, "pages_enabled_to_retag_count"=>0, "updated_at"=>2013-08-20 04:35:47 UTC}})
你能行

Document.all.each do |d|
  d.update({ :pages_enabled_count => d.pages.where(:disabled => false).count,
             :pages_enabled_to_query_count => d.pages.where(:disabled => false, :to_query => true).count,
             :pages_enabled_to_rescan_count => d.pages.where(:disabled => false, :to_rescan => true).count,
             :pages_enabled_to_retag_count => d.pages.where(:disabled => false, :to_retag => true).count
          })
end
这将稍微加快速度,因为不会运行
回调
验证


如果这是一个时间的活动,你可以考虑在代码> MangGDB < /代码>上执行它,而不使用<代码>蒙古文< /代码>

你添加了任何索引吗?如果是的话,你能把它们寄出去吗?