mongodb - 具有 mongodb 架构/端点设计的 Facebook“点赞”功能
问题描述
我想出了多种解决方案,但似乎没有一个是“面向未来的”。
让我先迭代我的解决方案。
特征的验收标准
- 用户可以喜欢或不喜欢帖子
- 用户可以在他已经喜欢的帖子上看到“充满的心”
假设
有用户收藏和帖子收藏
可能的解决方案
1. 放置喜欢该帖子的用户参考数组。
问题
超级简单,但是一旦“帖子”增长太多,所有查询帖子的用户都会受到影响。还将潜在的无限数组放入文档中。
2. 将 Post 引用数组放入 User
问题
与上述相同,但只有数据增长的用户可能会受到影响。
3. 引用 User 和 Post 的模式,并在 Post 中添加计数器
问题
这个文件会增长很快,每天都会有很多用户喜欢很多帖子。如何查询用户喜欢的帖子?如果这个集合增长到数百万个类似的文档怎么办?
到目前为止我还没有找到正确的答案,一开始我以为#1是要走的路,然后很快就改变了主意到#3,然后我就想——如果它长得很快,而且很难查询到“喜欢”怎么办“每次我获取帖子时都来自数百万个文档?现在我认为#2 是“更安全”的选项,但我可能错了。如果我去#3,我想分开 /likes 和 /posts 端点,所以这是另一个问题。- 我将如何从帖子列表中查询用户是否喜欢?它应该是单独的单一端点吗?但是每次加载帖子列表时都会调用太多。我很困惑 :(
谢谢阅读。
解决方案
3号门!然后,您将使用带有 User+Post 的唯一复合索引来防止重复并加快查询时间。
当您查询帖子时,您将想要使用聚合管道,以便您可以 $lookup 以查看每个帖子是否存在“喜欢”文档。
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
https://docs.mongodb.com/manual/core/index-compound/index.html
应该让你开始。
推荐阅读
- mongodb - mongodb IndexError:从空的双端队列中弹出
- amazon-web-services - 写入 CloudWatch 日志资源策略失败:LimitExceededException:超出资源限制
- c - 当我在 CLion 2020.3 上使用远程工具链时,cmake 无法解析本地路径
- google-apps-script - 演示文稿打开时,Google Apps 脚本自定义菜单/createMenu 未显示在幻灯片中
- python - Scikit-learn 的 feature_names 来自哪里?
- matlab - 如何在一个巨大的数组上并行化操作
- haskell - 从同一个`main`运行两个warp服务器是否安全?
- python - 使用 input() 时我不断收到 EOFError 我是新手,这是为了学校,有人可以帮我解决这个问题
- python-3.x - 无法从 python 或操作系统关闭/删除文件
- typescript - 用于处理 Promise Rejection 的 TypeScript 语法