具有 mongodb schema/endpoint 设计的 Facebook "like" 功能

Facebook "like" feature with mongodb schema/endpoint design

我提出了多种解决方案,但其中 none 似乎是“面向未来的证明”。

让我先重复我的解决方案。

特征的验收标准

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

假设

有用户 collection 和 Post collection

可能的解决方案

1.放入喜欢 post.

的用户引用数组

问题

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

2。将 Post 个引用数组放入 User

问题

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

3。喜欢参考 User 和 Post 的架构,并向 Post

添加计数器

问题

这个文档会增长的很快,很多用户每天都会点很多post。如何查询用户喜欢的post?如果这个 collection 增长到数百万个类似文档怎么办?

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

感谢阅读。

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

当您查询 posts 时,您将要使用聚合管道,这样您就可以 $lookup 查看每个 post.[=12 的 'like' 文档是否存在=]

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

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

应该可以帮助您入门。