我在一个Rails项目中使用Mongoid。我有一个非常大的收藏集,我想为其更新每个文档的特定字段。
我觉得我应该使用Mongoid的update_all
方法:
Collection.all.update_all(field: new_value)
但是,用什么方法比做起来要好:
Collection.all.each do |document|
document.field = new_value
document.save
end
您能解释一下update_all
方法在做什么,它比保存每个文档的简单循环更有效。您是否知道其他方法/方法可以使我的代码更高效。
____ EDIT ___
我还检查了一个类似的gem,它可以并行运行代码: https://github.com/grosser/parallel 我的代码的另一种选择是:
licenses = License.all
Parallel.each(licenses, in_processes: 6, progress: 'setting scope_type individual for license_offers') do |license|
license.license_offer.scope_type = :individual
license.save!
end
如何确定最有效的选择?
答案 0 :(得分:2)
使用update_all时,不会进行实例化,回调或验证。它只运行一个查询。 但是在循环更新的情况下。如果有1000条记录要更新,它将执行1000次查询和验证,并且还将运行回叫,这将显示该过程并消耗更多内存