iOS Firebase 按日期分页

iOS Firebase Paginate by Date

我有一个笔记应用程序。我通常按​​ childByAutoId 对下面的 posts-userIds 节点进行分页,效果很好。我允许用户进行编辑,此时我只更新所有内容并将 editDate 添加到 post 本身。但是 editDate 位于 posts ref,而不是 posts-usersIds ref.

如何按 editDate 对 posts-usersIds ref 进行分页?问题是 editDates 是可选的,这意味着它们可能会进行 200 posts,但只有 2 次编辑甚至 none。无论哪种方式,如果用户想先看到 editDates,他们仍然需要看到 postDates 以及它们

订单将首先是 editDates,然后是 postDates,或者如果没有任何 editDates,则只显示所有 postDates

我在想,而不是使用 1 作为值,也许我应该把 postDate 或 editDate(如果他们做了一个)作为 posts-userIds ref 的值,如

-postId-123: 1 // this what I normally use, it has no meaning, just a 1 so that it has a value
-postId-123: replace the 1 with the postDate and change this to editDate when they make an edit

也许我可以使用 ref.queryOrderedByValue() 但我不确定。

我的结构如下:

@posts
  @postId-123 // childByAutoId
     -uid: "userId-ABC"
     -postDate: 1640898417.456389
     -editDate: 1640814049.713224 // edit date is only there if the user made an edit

@posts-userIds
    @userId-ABC
       -postId-123: 1

我分页

let ref = Database.database().reference().child("posts-userIds").child(Auth.auth().currentUser!.uid)

if startKey == nil  {

    ref.queryOrderedByKey()
        .queryLimited(toLast: 20)
        .observeSingleEvent(of: .value, with: { (snapshot) in

        // get posts and set startKey
    })

} else {

    ref.queryOrderedByKey()
        .queryEnding(atValue: startKey!)
        .queryLimited(toLast: 21)
        .observeSingleEvent(of: .value, with: { (snapshot) in
    })
}


                

Firebase 查询只能 order/filter 在其正在考虑 return 的节点下(在固定路径中)的值。因此,您不能对 posts.

下的值进行 posts-userIds

解决方案是在 posts-userIds 下复制您想要 order/filter 的值,或者直接作为值(在这种情况下,您将使用 queryOrderedByValue 作为订单),或者在 child 属性 中(在这种情况下,您将使用 queryOrdered(byChild:) 作为订单。我倾向于使用后者,因为一旦有一个值,您想要 order/filter 上,通常会有更多的人下线。

这种数据复制在 NoSQL 数据库中很常见,所以如果您还不习惯,我建议您阅读 NoSQL data modeling, and watching Firebase for SQL developers