gpt4 book ai didi

database - 在 Firestore 中使用嵌套的单个查询

转载 作者:太空狗 更新时间:2023-10-30 01:39:16 24 4
gpt4 key购买 nike

最近我将我的数据模型从 Firebase 移到了 Firestore。我所有的代码都在工作,但我在检索某些数据的嵌套查询方面遇到了一些丑陋的麻烦。重点是:

现在这部分我的数据模型看起来像这样(是的!另一个关注者/提要示例):

{
"Users": { //Collection
"UserId1" : { //Document
"Feed" : { //Subcollection of Id of posts from users this user Follow
"PostId1" : { //Document
"timeStamp" : "SomeDate"
},
"PostId2" : {
"timeStamp" : "SomeDate"
},
"PostId3" : {
"timeStamp" : "SomeDate"
}
}
//Some data
}
},
"Posts":{ //Collection
"PostId1":{ //Document
"Comments" :{ //Subcollection
"commentId" : { //Document
"authorId": "UserId1"
//comentsData
}
},
"Likes" : { //Subcollection
"UserId1" : { //Document
"liked" : true
}
}
}
}
}

我的问题是,要检索用户提要的帖子,我应该通过以下方式查询:

  • 从我的 Feed 中按时间戳获取最后 X 个文档排序器

feedCol(userId).orderBy(CREATION_DATE, Query.Direction.DESCENDING).limit(limit)

  • 之后,我应该对从列表中检索到的每个帖子执行一次查询:workoutPostCol.document(postId)

  • 现在我有了每篇文章的数据,但我想拍摄作者的用户名、图片、分数等,它们在不同的 Document 中,所以,我再次应该对在帖子列表 userSocial(userId).document(toId)

  • 中检索到的每个 authorId 执行另一个查询
  • 最后,同样重要的是,我需要知道我的当前用户是否已经喜欢该帖子,因此我需要(再次)对每个帖子进行一次查询并检查我的 userId 是否在 中帖子/喜欢/{userId}

现在一切正常,但考虑到 Firestore 的价格取决于数据库调用的数量,而且它不会使我的查询更简单,我不知道如果只是我的数据模型不适合这种数据库,我应该转向普通的 SQL 或再次回到 Firebase

注意:我知道,将喜欢、提要等的子集合移动到我的用户或发布文档中的数组列表中,一切都会容易得多,但文档的限制是 1MB 如果这个增长太多,它会在未来崩溃。另一方面,Firestore 不允许子文档查询(目前)或使用多个 whereEqualToOR 子句。

我已经阅读了很多用户的帖子,他们在寻找一种简单的方法来存储这种ID 的 关系以进行连接查询 在他们的 Collections 中,使用 Arraylists 会很棒,但是 1MB 的限制限制了它。

希望有人能够澄清这一点,或者至少教我一些新东西;也许我的模型很糟糕,有一种简单易行的方法可以做到这一点吗?或者我的模型可能不适用于非 sql 数据库。

最佳答案

不能 100% 确定这是否能完全解决问题,因为您的使用可能存在边缘情况。但经过 5 分钟的快速思考,我觉得以下内容可以解决您的问题:

您可以考虑使用类似于 Instagram 的模型。如果我没记错的话,他们使用的是基于 events 的集合。在这个特定的上下文中,events 是指用户采取的所有操作。所以 comment 是一个事件,like 是一个事件等等。

这将使您总共需要三个主要集合。

users
-- userID1
---- userdata (profile pic, bio etc.)
---- postsByUser : [postID1, postID2]
---- followedBy : [userID2, ... ]
---- following : [userID2, ... ]
-- userID2
---- userdata (profile pic, bio etc.)


posts
-- postID1 (timestamp, so it's sortable)
---- contents
---- author : userID1
---- authorPic : authorPicUrl
---- authorPoints : 12345
---- taggedUsers : []
---- comments
------ comment1 : { copy of comment event }
---- likes : [userID1, userID2]
-- postID2 (timestamp)
---- contents
...


events
-- eventID1
---- type : comment
---- timestamp
---- byWhom : userID
---- toWhichPost : postID
---- contents : comment-text
-- eventID2
---- type : like
---- timestamp
---- byWhom : userID
---- toWhichPost : postID

对于您的用户简介页面,您将查询users

对于新闻提要,您将查询 posts 以获取您的用户在过去 1 天(或任何给定时间跨度)内关注的用户 ID 的所有帖子,

对于事件提要页面(评论/喜欢等),您将查询与您的用户 ID 相关的限制在过去 1 天(或任何给定时间跨度)内的事件

最后在用户滚动时查询接下来几天的帖子/事件(或者那些天是否没有新事件)

同样,这只是一个快速的想法,我知道 SOF 的长老们通常习惯于将这些钉在十字架上,所以如果这个答案有缺陷,请原谅 SOF 的同胞们:)

希望对弗朗西斯科有帮助,

祝你好运!

关于database - 在 Firestore 中使用嵌套的单个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46724996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com