我有一个嵌入许多通知的用户模型,我必须遍历用户集合,然后他们遍历每个通知以删除它或不删除它。
首先,我遇到了光标超时错误,然后使用了这个步骤方法(我在某处读过)和“唯一”标准。我的实际循环代码是这样的:
per_batch = 20
users_targeted = User.only(:notifications, :slug).where(:notifications_count.gt => 40).asc(:slug)
0.step(users_targeted.count, per_batch) do |offset|
users_targeted.limit(per_batch).skip(offset).each do |user|
user.notifications.only(:_id).read.desc(:updated_at).skip(40).each do |n|
n.destroy
end
end
end
- 我正在使用 mongoid 2.4.8
- 用户收集量约为 8k
- 每个用户最多有 300 条通知
现在,当循环在 3k-4k 用户上时,Heroku dyno 的内存超出其限制并且循环停止。
有谁知道这个问题的解决方案?我必须做很多这样的循环,所以这对我来说有点麻烦。