【发布时间】:2011-05-01 20:54:45
【问题描述】:
我正在制作一个使用经典“关注”机制的应用程序(Twitter 和网络上的许多其他应用程序都使用这种机制)。我正在使用 MongoDB。 不过,我的系统有一点不同:用户可以关注组个用户。这意味着,如果您关注一个群组,您将自动关注属于该群组的所有用户。当然,用户可以属于多个组。
这是我想出的:
- 当用户A跟随用户B时,用户B的ID被添加到用户A文档中的嵌入数组(称为
following)中 - 为了取消关注,我从
following数组中删除了关注用户的ID 组的工作方式相同:当 用户 A 跟随 组 X 时,组 X 的 id 被添加到
following数组中。 (我实际上添加了一个DBRef,所以我知道连接是针对用户还是组。)当我必须检查 user A 是否跟随 group X 时,我只需在 user A' 中搜索组的 id s 跟随数组。
- 当我必须检查 user A 是否跟随 user 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,我确实这样做了并且它有效,但我很想避免这种情况以使事情变得更简单。也许我只需要跳出框框思考。或者,也许我两次尝试都采取了错误的方法。任何人都必须做类似的事情并提出更好的解决方案?
(这实际上是我的this older question 的后续。我决定发布一个新问题来更好地解释我的新情况;我希望这不是问题。)
【问题讨论】:
-
我的投票是使用地图将关注者列表写入临时集合
-
我听说 Map/Reduce 可能很慢,所以我不能在每次页面加载时都这样做。这意味着关注者列表不会是最新的,所以我宁愿避免这种解决方案......
标签: database-design mongodb software-design