首页 > 解决方案 > Mongoid 为什么我应该使用 update_all 而不是简单地循环收集和保存

问题描述

我在我的一个 Rails 项目中使用 Mongoid。我有一个非常大的集合,我想更新每个文档的特定字段。我觉得我应该使用update_allMongoid 的方法:

Collection.all.update_all(field: new_value)

但是以什么方式比这样做更好:

Collection.all.each do |document|
  document.field = new_value
  document.save
end

您能否解释一下是什么update_all方法使它比保存每个文档的简单循环更高效。您是否知道任何其他可以使我的代码性能更高的方式/方法。

____编辑___

我还检查了一个可以并行运行代码的 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

如何确定性能最高的选项是什么?

标签: rubyperformanceruby-on-rails-3mongoid

解决方案


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


推荐阅读