私がやろうとしているのは、投稿数が最も多いユーザーを見つけることです。User
とPost
はMongoid::Document
に相当するActiveRecordはUser.group(posts)
機能しません。ユーザーの投稿数にアクセスできます@user.posts.count
すべてのユーザーの配列を投稿数で並べ替えずに、ほとんどの投稿を持つユーザーを見つけるにはどうすればよいですか?
私がやろうとしているのは、投稿数が最も多いユーザーを見つけることです。User
とPost
はMongoid::Document
に相当するActiveRecordはUser.group(posts)
機能しません。ユーザーの投稿数にアクセスできます@user.posts.count
すべてのユーザーの配列を投稿数で並べ替えずに、ほとんどの投稿を持つユーザーを見つけるにはどうすればよいですか?
:allを使用すると、Mongoidコレクションは配列関数に応答します。
User.all.max_by {|user| user.posts.count}
これにより、すべてのユーザーが繰り返され、投稿数が最も多いユーザーが検索されます。
データベースがすべての作業を行うSQLに似た方法が必要な場合は、1つではありません。MongoDBには結合もSQLもありません。データモデルをそのままにしておくと、すべてのユーザーを反復処理し、それらの投稿数を取得してから並べ替えることしかできません。
N+1
ただし、投稿数をユーザードキュメントのフィールドに保存し、実際に保持することで、このクエリパターンを排除できます(新しい投稿が追加されたときにインクリメントするなど)。これは「カウンターキャッシュ」と呼ばれ、これを行うmongoid用のプラグインがいくつかあります。
そのキャッシュ列を取得したら、問題なく並べ替えることができます。