多くの通知を埋め込むユーザーモデルを取得しました。ユーザーコレクションをループする必要があり、各通知をループして削除するかどうかを決定します。
最初にカーソルタイムアウトエラーが発生し、次にこのステップメソッド(どこかで読んだ)と「のみ」の基準を使用しました。私の実際のループコードは次のようなものです:
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 のメモリが限界を超え、ループが停止します。
この問題の解決策を知っている人はいますか? このようなループをたくさんしなければならないので、これは私にとっては面倒なことでした。