最近我将我的数据模型从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的帖子,我应该以下一个方式查询:
feedCol(userId).orderBy(CREATION_DATE, Query.Direction.DESCENDING).limit(limit)
之后我应该对从列表中检索到的每个帖子进行一次查询:workoutPostCol.document(postId)
现在我有每个帖子的数据,但是我想拍摄作者的用户名,图片,分数等等,这是另一个Document
,所以,我再次做另一个在帖子列表authorId
userSocial(userId).document(toId)
的单个查询
最后,同样重要的是,我需要知道我当前的用户是否已经喜欢该帖子,所以我需要对每个帖子进行一次查询(再次)并检查我的userId是否在{{1 }}
现在一切正常,但认为posts/likes/{userId}
的价格取决于数据库调用的数量,而且它不会使我的查询更简单,我不知道它是否只是我的数据模型不适合这种数据库,我应该转为正常Firestore
或者再次回到SQL
。
注意:我知道一切都会更容易将喜欢,提要等子集合移动到我的用户或发布文档中的arraylists,但文档的限制是 1MB 如果这个增长很多,它将来会崩溃。另一方面,Firebase
不允许使用多个Firestore
的子文档查询(尚未)或OR
子句。
我已经阅读了许多用户的帖子,他们在寻找一种简单的方法来存储这种whereEqualTo
关系时,会在ID's
中joins
和queries
使用Collections
会很棒,但是1MB的限制会限制它。
希望有人能够澄清这一点,或者至少教会我一些新东西;也许我的模型只是垃圾,有一个简单,最简单的方法吗?或许我的模型不适用于非SQL数据库。
答案 0 :(得分:18)
不是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
。
对于新闻Feed,您可以在最近1天(或任何给定的时间段)内按用户ID跟踪的所有帖子查询posts
,
对于活动供稿页面(评论/喜欢等),您将查询与您的用户ID相关的events
,该ID仅限于过去1天(或任何给定的时间跨度)
最后在用户滚动时查询帖子/事件的下一天(或者在那些日子里没有新活动)
同样,这只是一个简单的想法,我知道SOF的长老通常习惯将这些钉在十字架上,所以如果这个答案有缺陷,请原谅我SOF的成员:)
希望它有助于Francisco,
祝你好运!