ruby - Mongoid 为什么我应该使用 update_all 而不是简单地循环收集和保存
问题描述
我在我的一个 Rails 项目中使用 Mongoid。我有一个非常大的集合,我想更新每个文档的特定字段。我觉得我应该使用update_all
Mongoid 的方法:
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
如何确定性能最高的选项是什么?
解决方案
使用 update_all 不会进行实例化、回调或验证。它只运行一个查询。但是在循环更新的情况下。如果有 1000 条记录要更新,它将执行 1000 次查询和验证,并且还会运行回调,这将显示流程并消耗更多内存
推荐阅读
- c++ - n皇后问题的程序仅适用于n<=10,即使它应该适用于所有n
- c++ - c ++对对象的排序向量,编译错误要求运算符“=”
- javascript - 如何从 ASP.NET MVC 中的另一个视图修改 share layout.cshtml 中的 image.OnClick?
- python - 如何使用python使用列作为索引将多个csv文件连接成一个csv文件
- python - python中是否有任何方法可以自动更正单列excel文件的多行中的拼写错误?
- javascript - 亲子关系不正常
- javascript - 页面加载时自动按键
- google-apps-script - Google 表格到日历应用脚本 ColorId
- angular - 尝试使用 Angular firebase 创建 docReference
- node.js - ES6 Set 在简单的 Express Node.js 应用程序中不起作用