首页 > 解决方案 > 具有 mongodb 架构/端点设计的 Facebook“点赞”功能

问题描述

我想出了多种解决方案,但似乎没有一个是“面向未来的”。

让我先迭代我的解决方案。

特征的验收标准

  1. 用户可以喜欢或不喜欢帖子
  2. 用户可以在他已经喜欢的帖子上看到“充满的心”

假设

有用户收藏和帖子收藏

可能的解决方案

1. 放置喜欢该帖子的用户参考数组。

问题

超级简单,但是一旦“帖子”增长太多,所有查询帖子的用户都会受到影响。还将潜在的无限数组放入文档中。

2. 将 Post 引用数组放入 User

问题

与上述相同,但只有数据增长的用户可能会受到影响。

3. 引用 User 和 Post 的模式,并在 Post 中添加计数器

问题

这个文件会增长很快,每天都会有很多用户喜欢很多帖子。如何查询用户喜欢的帖子?如果这个集合增长到数百万个类似的文档怎么办?

到目前为止我还没有找到正确的答案,一开始我以为#1是要走的路,然后很快就改变了主意到#3,然后我就想——如果它长得很快,而且很难查询到“喜欢”怎么办“每次我获取帖子时都来自数百万个文档?现在我认为#2 是“更安全”的选项,但我可能错了。如果我去#3,我想分开 /likes 和 /posts 端点,所以这是另一个问题。- 我将如何从帖子列表中查询用户是否喜欢?它应该是单独的单一端点吗?但是每次加载帖子列表时都会调用太多。我很困惑 :(

谢谢阅读。

标签: mongodbdatabase-designdatabase-schema

解决方案


3号门!然后,您将使用带有 User+Post 的唯一复合索引来防止重复并加快查询时间。

当您查询帖子时,您将想要使用聚合管道,以便您可以 $lookup 以查看每个帖子是否存在“喜欢”文档。

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

https://docs.mongodb.com/manual/core/index-compound/index.html

应该让你开始。


推荐阅读