我正在使用PHP和MongoDB创建API。在这个系统中我有用户,每个用户都可以上传文件。用户也可以互相"关注"。
我需要返回经过身份验证的用户正在关注的用户上传的所有最新文件的提要。我真的不知道如何设计和执行这个
这就是我想要实现的。
- 获取该用户关注的所有用户
- 循环遍历这个用户数组,并为每个用户获取最新的4个文件,并将它们添加到数组中。 按文件创建日期排序。
- 返回它。
这真的是最优的方式吗?有没有更好的办法?用户保存在采集文件中用户和文件保存在采集文件中。以下内容保存在集合users.follower .
这是扇入与扇出的问题。我建议你试试fan-out:
为您的用户保留feed
集合。当用户上传文档时,在她的每个好友提要项集合中插入一个新的提要项。该集合可能如下所示:
{
"_id": (some id)
"UserId": (id of the user who 'owns', i.e. reads this feed)
"FriendId": (if of the friend who posted the file)
"FriendName": "John Doe" (name of the fried, denormalized)
"Timestamp": ...
}
使用复合索引{UserId, Timestamp}
。
这种方法的写入量很大:如果Jane有数百个朋友,那么这数百个插入将占用它们的时间。另一方面,上传文件通常需要花费很多时间,所以开销可以忽略不计,读取将非常简单。
当然,这可以通过更多的努力进一步优化,但对于相当大的流量,它应该做得很好。