如何按单个页面对 Firestore 数据集进行分页?

Pas*_*cal 7 javascript firebase google-cloud-firestore

我想按 20 个项目的页面对存储在 Firebase 中的论坛帖子进行分页,如下所示:

  • 用户访问 foo.com/1 --> 加载最近 20 个帖子
  • 用户访问 foo.com/2 --> 加载帖子 21-40

等等。

现在我知道我可以使用查询游标(如此处所述,这对于无限滚动来说效果非常好,因为我从页面 1->2->3 等开始,每次我都有最后一个可见的我的方法中可供参考的文档.startAfter(lastVisible)

但是,如果我希望用户能够访问第 13 页直接查看帖子 241-260,该怎么办?有没有办法从页面文档 241 开始,而不需要先进行(多个)查询来获取 lastVisible 文档?

添加:

这可能非常糟糕,因此在执行以下操作时要小心。我找到了以下方法来“解决”这个问题:

const pageNo = 1 /* variable */
const postsPerPage = 20

const baseRef = fireDb.collection("posts")

let currentPageRef

if (pageNo === 1) {
  currentPageRef = baseRef.limit(postsPerPage)

} else {

  let lastVisibleRef = baseRef.limit((pageNo-1) * postsPerPage)
  const lastVisibleQuerySnapshot = await lastVisibleRef.get()
  const lastVisiblePost = lastVisibleQuerySnapshot.docs[lastVisibleQuerySnapshot.docs.length-1]

  currentPageRef = baseRef.startAfter(lastVisiblePost).limit(postsPerPage)
}
const currentPageQuerySnapshot = await currentPageRef.get()
Run Code Online (Sandbox Code Playgroud)

这需要两个查询。但它实现了我想要实现的目标。谁能判断该解决方案的效率/计费有多糟糕?例如,如果有人访问第 999 页,我担心成本会很高?

Dou*_*son 4

使用 Firestore 客户端 SDK,无法指定查询结果的偏移量。您可以在 GitHub 上阅读有关此问题的讨论

然而,服务器 SDK 确实有offset

  • 请注意,根据 Google 定价,您需要为每个跳过的对象付费。更多信息:https://github.com/firebase/firebase-js-sdk/issues/479 (2认同)