0

多くの通知を埋め込むユーザーモデルを取得しました。ユーザーコレクションをループする必要があり、各通知をループして削除するかどうかを決定します。

最初にカーソルタイムアウトエラーが発生し、次にこのステップメソッド(どこかで読んだ)と「のみ」の基準を使用しました。私の実際のループコードは次のようなものです:

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 のメモリが限界を超え、ループが停止します。

この問題の解決策を知っている人はいますか? このようなループをたくさんしなければならないので、これは私にとっては面倒なことでした。

4

1 に答える 1