我正在制作一个使用经典“关注”机制的应用程序(Twitter 和网络上的许多其他应用程序都使用这种机制)。我正在使用 MongoDB。不过,我的系统有一点不同:用户可以关注用户组。这意味着,如果您关注一个群组,您将自动关注属于该群组的所有用户。当然,用户可以属于多个组。
这就是我想出的:
- 当用户 A跟随用户 B
following
时,用户 B 的 id 被添加到用户 A 文档中的嵌入数组(称为)中 following
对于取消关注,我从数组中删除关注用户的 id组以相同的方式工作:当用户 A跟随组 X时,组 X 的 id 被添加到
following
数组中。(我实际上添加了一个DBRef
,所以我知道连接是针对用户还是组。)当我必须检查用户 A是否跟随组 X时,我只需在用户 A的以下数组中搜索组的 ID 。
- 当我必须检查用户 A是否跟随用户 B时,事情变得有点棘手。每个用户的文档都有一个嵌入式数组,列出了用户所属的所有组。因此,我使用
$or
条件来检查用户 A 是直接关注用户 B 还是通过群组关注用户 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
我之前使用的条件下,关注包含同一用户的两个组的用户将被列出两次。为了避免这种情况,我可以使用 group 或 MapReduce,我确实这样做了并且它有效,但我很想避免这种情况以使事情变得更简单。也许我只需要跳出框框思考。或者,也许我两次尝试都采取了错误的方法。任何人都必须做类似的事情并提出更好的解决方案?
(这实际上是我这个老问题的后续。我决定发布一个新问题来更好地解释我的新情况;我希望这不是问题。)