当前位置: 首页 > 知识库问答 >
问题:

Firestore社交媒体模型结构

司空海荣
2023-03-14

我有一个posts集合,我的应用程序在其中存储用户的所有帖子,数据结构如下:

+ uid (the user id of the creator)
+ text-content : String
+ tagged-users: [String]
+ assigned-media: [{"downloadUrl": String, "storageLocation": String}]
+ type: String
+ typestamp: Timestamp
+ Likes
    + uid (the user id of the liking person)
    + timestamp: Timestamp
    + postId (optional, depending on the results of the collection group queries)

现在,我想向我的用户显示这个集合的所有帖子;但是,只有当用户跟随创建帖子的人时,即帖子文档的uid字段适合。

我知道如果用户只关注一个人,查询集合是很简单的,也就是说,我有一个简单的在哪里子句。但是:如果我的用户关注10,000人或更多人呢?我怎么查询呢?

另外,我应该如何存储跟随,即用户跟随的人?使用简单的数组似乎不适合我,但是使用所有其他选项,我不能查询来自我跟随的人的帖子的帖子集合。

如果我能得到任何帮助,我将不胜感激!

共有1个答案

柴博
2023-03-14

这是一个复杂的问题(我不是100%确定这是一个合适的地方),我会尽我最大的努力让你开始,

免责声明,这可能适用于您的用例,也可能不适用于您的用例

将您的服务分为3个系列:-用户-关注者-帖子

用户集合非常简单,您只需要文档id(您已经有了它)。

{
  "andyIsTheBest": {
    uid: `andyIsTheBest`
    // ...
  },
  "sophieTheBest": {
     uid: `sophieTheBest`,
     // ...
   },
   "andyTheWorst": {
     uid: `andyTheWorst`,
     // ...
   },
}

关注者镜像用户的文档id,它应该如下所示:

{
  "andyIsTheBest": {
     last_post: 2019,
     followers: [
       'sophieTheBest', 'andyTheWorst'
     ],
     recent: [
       {
         post_id: 112233, // from the post collection
         seq: 2019
       }
     ]
  }
}

最后,帖子集合看起来像这样:

{
   "112233": {
     seq: 2019,
     body: `blabla the cool post`
     author: `andyIsTheBest`
   }
}

重要的是,请注意序列seq编号以及last_post,您可以通过云函数更新此值,以便跟踪它,然后剩下的只是实现细节:

const remove = firebase.firestore.FieldValue.arrayRemove
const union = firebase.firestore.FieldValue.arrayUnion

const follow = async (toFollow, user) => {
    await db
    .collection('followers')
    .doc(toFollow)
    .update({ users: union(user) });
}

const unfollow  = async (toUnFollow, user) => {
    await db
    .collection('followers')
    .doc(toUnFollow);
    .update({ users: remove(user) });
}

const feed = async (user) => {
   await db.collection(`followers`)
      .where(`followers`, `array-contains`, user)
      .orderBy(`last_post`, `desc`)
      .limit(10)
      .get()

   // do whatever business logic you need down here
}

基本上这样,不管你有1万亿或1万亿,查询应该是可以的。

有很多细节我没有涵盖,但这应该可以让你开始。

希望这有帮助。

这要归功于我的同事们,他们在我的公司实现了这一点^^

 类似资料:
  • 因此,我想创建一种社交媒体应用程序,并使用fiRest作为主数据库。 目标是创建“facebook”新闻源。 每个用户都有一个朋友列表,每个用户都可以创建帖子。 每个帖子都可以被修改为对应用程序的所有用户或用户朋友可见。所以每个用户都可以向他所有的朋友发布帖子,并向应用程序中的每个人发布帖子。 此外,用户还可以在新闻提要中“保存”他们喜欢的帖子。(类似帖子子集合) 现在在用户的新闻提要中-我如何查

  • 当用户导航到Likes或Comments屏幕时,他/她将分别看到用户指定帖子的Likes或Comments列表。 用这种结构能正确处理这两种情况吗?或者将评论和喜欢集合放在/posts/{userId}/userposts/{postId}/(也可以作为子集合)中会更好 Firestore可以同时执行“多个集合查询”吗?以便在我的“交互”屏幕中,我可以从按日期排序的不同集合中获取所需的数据 我很感

  • 我正在尝试为一个简单的社交媒体概念创建一个简单的云Firestore数据库结构。 每个用户最多可以有一个可以随时更新的帖子(一个“最喜欢的”帖子除外)。用户“最喜欢的”版本的帖子被保存为一个单独的帖子,当用户在其当前版本的帖子上收到比最喜欢的版本更多的赞时,该帖子可以被更新。 friends子集合存储好友用户名,因此很容易按用户名创建该用户的好友列表。我假设我可以通过将朋友的documentID与

  • 我有一个数据结构,由一个名为“民意测验”的集合组成“民意测验”有几个随机生成身份证的文档。在这些文档中,还有一个名为“答案”的额外集合用户对这些民意测验进行投票,投票都写入“答案”子集合。我在“答案”节点上使用. runTransaction()方法,目的是这个子集合(对于任何给定的投票)不断被用户更新和写入。 我一直在阅读关于火力恢复的社交媒体结构。然而,我最近遇到了火力恢复的一个新功能,“ar

  • 据我所知,这些方法需要大致相同的读写次数。 一个想法是在中有一个名为posts的字段,这是我想为用户提取的文档数组。这将允许我直接从中提取数据,并获得数据的最新版本。 另一种方法似乎更Firebasey,它将文档存储在users/{userId}/feeds中,这些feeds是帖子本身的副本。我可以使用与中的数据相同的。假设,如果我需要为任何审查更新数据,我可以使用组集合查询来获取所有称为提要的集

  • 我们正在使用Firebase构建一个社交媒体网络应用程序,并使用firest来存储用户和他们的帖子。 当用户喜欢某个帖子时,我们会将其保存在中,并在帖子文档中更新。 假设我们的应用每天有100万用户,他们都非常喜欢病毒性帖子。 现在,firebase表示一个文档每秒不能处理超过一次写入。然而,我们已经看到,我们可以每秒更新文档几次,但他们仍然不建议这样做。 我的问题是,在firestore中存储所