我想从errbit开始-我们的mongodb数据库中有数百万条记录,而我们没有清理它们。我想重新开始,但我不想丢失我的用户帐户。
我尝试运行这些例程(https://mensfeld.pl/2015/01/making-errbit-work-faster-by-keeping-it-clean-and-tidy/):
bundle exec rake errbit:clear_resolveddesc 'Resolves problems that didnt occur for 2 weeks'
task :cleanup => :environment do
offset = 2.weeks.ago
Problem.where(:updated_at.lt => offset).map(&:resolve!)
Notice.where(:updated_at.lt => offset).destroy_all
end但是第二个(删除超过2周的问题和通知),似乎永远都在运行。通过mongo shell查询问题和通知集合似乎没有显示任何被删除的内容……我们使用errbit V 0.7.0-dev和mongodb版本3.2.22。
发布于 2019-07-30 00:39:13
最快的方法是获得一个mongo控制台,并删除大多数集合。我建议停止您的errbit服务器,获取一个mongo控制台,连接到您使用的数据库并运行:
> db.errs.drop()
true
> db.problems.drop()
true
> db.backtraces.drop()
true
> db.notices.drop()
true
> db.comments.drop()发布于 2020-03-04 00:17:17
Problem.where(:updated_at.lt => 2.months.ago).destroy_all由于递归删除错误、通知和评论的N+1问题,运行时间太长,而且mongoid不支持嵌套的急切加载,所以更快删除的唯一方法-是手动获取这些ids并直接删除,而不是回调:
problem_ids = Problem.where(:updated_at.lt => 2.months.ago).pluck(:id)
err_ids = Err.where(problem_id: {:$in => problem_ids}).pluck(:id)
Notice.where(err_id:{:$in => err_ids}).delete_all
Err.where(id:{:$in => err_ids}).delete_all
Comment.where(problem_id: {:$in => problem_ids}).delete_all
Problem.where(id: {:$in => problem_ids}).delete_allhttps://stackoverflow.com/questions/57256872
复制相似问题