【问题标题】:Facebook "like" feature with mongodb schema/endpoint design具有 mongodb 架构/端点设计的 Facebook“点赞”功能
【发布时间】:2020-10-29 12:24:44
【问题描述】:

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

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

特征的接受标准

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

假设

有用户收藏和帖子收藏

可能的解决方案

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

问题

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

2。将 Post 引用数组放入 User

问题

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

3.与引用 User 和 Post 的模式类似,并向 Post 添加计数器

问题

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

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

感谢阅读。

【问题讨论】:

    标签: mongodb database-design database-schema


    【解决方案1】:

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

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

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

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

    应该让你开始。

    【讨论】:

    • 如果是这种情况,我的帖子端点可能会返回“喜欢”状态,它不会返回纯 Post 对象,现在我的服务具有依赖性。如何解决这个问题?
    • 是的,它将被添加到您的帖子对象的“喜欢”布尔值中。但是您可以通过在管道中使用默认值来保证它的存在。
    • 如果你决定让你的 Post 对象保持“纯”,你可以在一秒钟的请求中查询类似的数据。收到帖子后,映射它们的 _id,然后一次请求所有类似的数据,使用 $in 运算符从 db 查询。不过我会先玩 $lookup。
    • 正是我要找的,SELECT WHERE IN array of postIds,但是每个ids都会相当长,所以当我从客户端查询时,它不会超过url长度限制吗?比如说,我最初收到了 24 个帖子,我需要用 24 个 id 查询“like”。我该怎么做?
    • db.Likes.find({post: {$in: [array-of-ids]}}); 其中 'array-of-ids' 是传递给端点的参数。如果您每页的帖子只有 10 或 20 个,您应该没问题。_id hexes 是 24 个字符。不过,您始终可以发送请求的有效负载/正文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多