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

Fra*_*cia 27 database data-modeling nosql firebase google-cloud-firestore

最近我将我的数据模型从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
        }       
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为了检索用户的Feed的帖子,我应该以下一个方式查询:

  • 从我的Feed中通过timeStamp获取最后的X文档订购者

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

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

  • 现在我有每个帖子的数据,但是我想要拍摄作者的用户名,图片,分数......等等Document,所以,我再次authorId对帖子列表中检索到的每一个进行另一个查询userSocial(userId).document(toId)

  • 最后,同样重要的是,我需要知道我当前的用户是否已经喜欢该帖子,所以我需要对每个帖子进行一次查询(再次)并检查我的userId是否在里面 posts/likes/{userId}

现在一切正常,但是认为价格Firestore取决于数据库调用的数量,而且它不会使我的查询更简单,我不知道是否只是因为我的数据模型不适合这种数据库我应该恢复正常SQL或者再回到Firebase原点.

注意:我知道一切都会更容易将喜欢,提要等子集合移动到我的用户或发布文档中的arraylists,但文档的限制是1MB,如果这个增长很多,它会崩溃未来.另一方面,Firestore不允许子文档查询(尚)或OR使用多个子句whereEqualTo.

我已阅读来自谁拥有寻找一个简单的方法来存储这种问题的用户很多帖子的ID's关系,使joinsqueries他们Collections,使用Arraylists将是真棒,但1MB的限制也限制了.

希望有人能够澄清这一点,或者至少教会我一些新东西; 也许我的模型只是垃圾,有一个简单,最简单的方法吗?或者也许我的模型不适用于非SQL数据库.

joh*_*bay 19

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

您可以考虑使用类似于Instagram的模型.如果我的记忆对我很好,他们使用的是events基于收藏的.通过events在这个特定背景我指的是用户采取的一切行动.所以a comment是事件,a 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
Run Code Online (Sandbox Code Playgroud)

对于您的用户生物页面,您将进行查询users.

对于新闻Feed,您可以查询posts用户在过去1天(或任何给定时间段)内关注的所有帖子,

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

最后在用户滚动时查询帖子/事件的下一天(或者在那些日子里没有新活动)

再说一次,这只是一个快速的想法,我知道SOF的长老们习惯将这些通常钉在十字架上,所以请原谅我的SOF成员,如果这个答案有瑕疵:)

希望它有助于Francisco,

祝好运!