Mongoid为什么我应该使用update_all而不是简单地循环收集和保存

时间:2018-07-20 11:02:04

标签: ruby performance ruby-on-rails-3 mongoid

我在一个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

如何确定最有效的选择?

1 个答案:

答案 0 :(得分:2)

使用update_all时,不会进行实例化,回调或验证。它只运行一个查询。 但是在循环更新的情况下。如果有1000条记录要更新,它将执行1000次查询和验证,并且还将运行回叫,这将显示该过程并消耗更多内存