首页 文章

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

提问于
浏览
27

最近我将我的数据模型从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的帖子,我应该以下一个方式查询:

  • 从我的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 .

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

我已经阅读了许多用户的帖子,他们在寻找一种简单的方法来寻找一种简单的方法来存储这种 ID's 关系,在 Collections 中使用 joinsqueries ,使用 Arraylists 会很棒,但是1MB的限制限制了它 .

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

1 回答

  • 18

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

    您可以考虑使用类似于Instagram的模型 . 如果我的记忆很好,他们使用的是一个基于 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,您可以查询 posts ,查看您的用户在过去1天(或任何给定的时间 Span )内关注的所有帖子,

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

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

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

    希望它有助于Francisco,

    祝好运!

相关问题