私は、古典的な「フォロー」メカニズム (Twitter や Web 上の他の多くのアプリで使用されているメカニズム) を使用するアプリを作成しています。私はMongoDBを使用しています。ただし、私のシステムには違いがあります。ユーザーはユーザーのグループをフォローできます。つまり、グループをフォローすると、そのグループのメンバーであるすべてのユーザーを自動的にフォローすることになります。もちろん、ユーザーは複数のグループに所属できます。
これは私が思いついたものです:
- ユーザー Aがユーザー B をフォローすると、ユーザー B
following
の ID がユーザー A のドキュメントの埋め込み配列 ( と呼ばれる) に追加されます。 - フォローを解除するために、フォローしているユーザーのIDを
following
配列から削除します グループも同じように機能します。ユーザー Aがグループ X をフォローすると、グループ X
following
の ID が配列に追加されます。(実際に追加するDBRef
ので、接続先がユーザーかグループかがわかります。)ユーザー Aがグループ Xをフォローしているかどうかを確認する必要がある場合、ユーザー Aの次の配列でグループの ID を検索するだけです。
- ユーザー Aがユーザー Bをフォローしているかどうかを確認する必要がある場合、状況は少し複雑になります。各ユーザーのドキュメントには、ユーザーが属するすべてのグループをリストする埋め込み配列があります。そこで、
$or
条件を使用して、ユーザー A がユーザー B を直接フォローしているか、グループ経由でフォローしているかを確認します。このような:db.users.find({'$or':{'following.ref.$id':$user_id,'following.ref.$ref','users'},{'following.ref.$id':{'$in':$group_ids},'following.ref.$ref':'groups'}}})
これは問題なく機能しますが、いくつか問題があると思います。たとえば、ページネーションを含む特定のユーザーのフォロワーのリストを表示するにはどうすればよいですか? 埋め込みドキュメントで skip() と limit() を使用できません。
デザインを変更してuserfollow
コレクションを使用することで、埋め込みfollowing
ドキュメントと同じことを行うことができます。私が試したこのアプローチの問題点は、$or
以前に使用した条件では、同じユーザーを含む 2 つのグループをフォローしているユーザーが 2 回リストされることです。これを回避するには、実際に行ったグループまたは MapReduce を使用できますが、これは機能しますが、物事を単純にするためにこれを避けたいと思います。たぶん、私は箱から出して考える必要があるだけです。または、両方の試みで間違ったアプローチをとったのかもしれません。誰かがすでに同様のことをしなければならず、より良い解決策を思いつきましたか?
(これは実際には、私のこの古い質問のフォローアップです。新しい状況をよりよく説明するために、新しい質問を投稿することにしました。問題にならないことを願っています。)