firebase - Firebase Firestore 结构,用于获取不可见的热门帖子 - 社交
问题描述
这是当前的样本结构
Posts(Collection)
- post1Id : {
viewCount : 100,
likes : 45,
points : 190,
title : "Title",
postType : image/video
url : FileUrl,
createdOn : Timestamp,
createdBy : user20Id,
userName : name,
profilePic: url
}
Users(Collection)
- user1Id(Document):{
postsCount : 10,
userName : name,
profilePic : url
}
viewed(Collection)
- post1Id(Document):{
viewedTime : ""
}
- user2Id(Document)
最终目标是
- 我需要获取当前用户未查看的帖子,并在分页中按降序排列。
什么是可能的最佳解决方案(例如更改结构、云功能、来自客户端的多个查询)?
解决方案
我正在研究一种解决方案,以显示热门帖子并消除用户已经看到的帖子或不良内容。处理两个查询真的很痛苦,尤其是当用户群增加时。很难维护“已查看”集合并过滤新帖子。想象一下,有 100 万个查看过的帖子,然后过滤掉未看过的帖子。
所以我想出了一个解决方案,虽然不是很好,但仍然很酷。
所以这是我们的数据结构
帖子(集合)--postid(文档)
- 标题。
- 描述。
- 图片。
- 时间戳。
- 优先
这是一个包含基本细节的简单帖子结构。你可以看到我添加了一个优先级字段。这个领域会变魔术。
如何使用优先级。
- 我们应该查询以较高优先级开始并以较低优先级结束的帖子。
- 当用户发布新帖子时。将当前时间戳分配为默认优先级。
- 当用户对帖子点赞(喜欢)时,将优先级提高 1 分钟(60000 毫秒)
- 当用户对帖子投反对票(不喜欢)时,将优先级降低 1 分钟(60000 毫秒)
- 您可以每 24 小时重置一次优先级。如果您今天早上开始浏览提要,您将看到过去 24 小时内的帖子。达到 24 小时持续时间后,您可以将优先级重置为当前时间。可以根据您的需要更改 24 小时限制。您可能希望每 15 分钟重置一次限制。因为每 15 分钟可能会添加 100 条新帖子。此限制将确保提要中的内容重复。
因此,当您开始滚动提要时,您将首先获得所有热门帖子,然后再获得优先级较低的帖子。如果您今天发布帖子并且人们开始支持它。它将获得更长的生命周期,从而压倒糟糕的内容,并且当您对其投反对票时,只要用户无法访问它,它就会将帖子下推。
使用时间戳作为优先级,因为旧帖子应该随着时间的推移而失去优先级。即使是今天的热门帖子明天也应该失去优先权。
需要考虑的事项:
使用寿命可以根据您的需要而有所不同。用户群越大。你应该降低生命周期价值。因为如果今天发布的帖子得到 10,000 名用户的投票,那么它在未来 6.9 天的趋势是。如果有超过 100 个帖子被超过 10,000 名用户点赞,那么在这 6.9 天内您将永远看不到新帖子。因此,热门帖子几乎不会持续一两天。
因此,在这种情况下,您可以提供 10 秒的生命周期,对于 10,000 次投票,它将提供 1.1 天的生命周期。
这不是一个完美的解决方案,但它可以帮助您入门。
推荐阅读
- javascript - javascript 计数器脚本只是跳到 0
- c# - ASP.NET 如何在模式弹出 Bootstrap 4 上使用按钮而不关闭或刷新弹出窗口
- javascript - 如何检查本机反应是否为空?
- python - 根据多个条件为python中数据框中的行创建父ID
- c# - C# Cosmos 文件系统错误“未找到分区!”
- ansible - Ansible:执行shell脚本
- python - 如何使用 python 中的 treelib 库在树中插入节点?
- for-loop - for循环中的元组解构?
- javascript - 如何在 JavaScript 中修复“未捕获的类型错误:月份为空”
- angular - 在父路由器出口渲染子路由