与Firestore分页

时间:2019-04-21 20:40:07

标签: node.js google-cloud-firestore

我想使用Firestore对查询进行分页,因为我有一个非常大的集合(正在增长2万多个文档)。通过分页,我的意思是向用户显示一个数字数组,如果用户单击它,它将把他重定向到我的收藏中的特定块,并且只有在单击时才提取该块。例如,如果我有100个文档,并且每页显示10个,则我有一个从1到10的数字数组。每次用户单击,它将加载10个产品。

借助doc在查询游标上的startAfter()方法,我已经轻松实现了无限滚动。

但是,尝试遵循相同的文档进行分页,我只是不明白。我也尝试遵循此tutorial

到目前为止,这是我的代码:

let filteredProductsCollection = new Promise(function(resolve, reject) {
      productsCollection
        .orderBy("productName")
        .where(
          req.query.where.field,
          req.query.where.comparison,
          req.query.where.value
        )
        .startAfter(
          req.query.lastProduct
        )
        .limit(req.query.limit)
        .get()
        .then(collection => resolve(collection))
        .catch(err => reject(err));
}

然后我答应并保存最后一个文档

.then(snapshot => {
  let snapshots = {
    last
  };
  snapshot.forEach(doc => {
    snapshots[doc.id] = {
      ...doc.data(),
      id: doc.id
    };
  });
  res.status(200).send(data)
})

考虑到当前块(保存在lastProduct中),这将提取下一个产品块,这使我可以进行无限滚动,从而完美发挥作用。

我的主要问题是我不知道如何从中跳到分页功能。两个主要问题:

  • 我不知道查询中总共有多少个文档,因此无法向用户显示数字数组
  • 即使我有此数组,如何检索不直接位于已加载的先前块旁边的特定块?例如,如果我的用户当前在第1页上,如何查询第8页?

似乎所有教程都直接旨在描述如何进行分页,但是我听不懂。我对分页的定义错误吗?还是当它确实是“获取下一个数据块”功能时,他们称此功能为分页??

1 个答案:

答案 0 :(得分:1)

  

我不知道查询中总共有多少个文档,因此无法向用户显示数字数组

Firestore API中没有计数查询。如果您需要了解文档总数,则需要加载所有文档,或者在执行更新时保留一个计数器。由于分页是为了防止加载所有文档,因此我来看看distributed counters上的文档。

  

即使我有此数组,如何检索不直接位于已加载的先前块旁边的特定块?例如,如果我的用户当前在第1页上,如何查询第8页?

通常,Firestore API不适用于基于偏移量的分页。它更适合于按需加载数据的无限滚动方法。如果要实现分页,可以考虑使用确实支持offset-based queries的服务器端SDK。但是,即使这些可能也不是您所需要的,因为您需要为偏移“跳过”的所有文档付费。

我知道的唯一解决方法是为已阅读的每个页面保留键的列表(可能还有排序的其他字段)。或保留所有键的单独集合(因为您可以容纳1MB的文档大小限制中的很多键)。您可能还想看看FirestorePagingAdapter implementation of FirebaseUI,它已经实现了分页。