我的应用程序中有一个无限滚动列表。页面加载时,我订阅最初的 50 个项目,然后当用户向下滚动时,我订阅接下来的 50 个项目,依此类推。
const firestoreQuery = query(
collectionGroup(firestore, 'users'),
orderBy('createdAt', 'desc'),
startAfter(Timestamp.fromDate(new Date(startValue))), // empty on first call
limit(50));
我的计划是使用上面的查询(在初始调用时没有 startAfter 语句),保存最后看到的项目,然后在后续调用中传递最后看到的项目的createdAt。
文档似乎也倾向于不传递日期,而是传递整个最后一个文档快照作为查询游标。为什么这更好,这是否解决了第一种方法存在的任何问题?
注意:当您滚动列表时,可以添加新项目并需要显示在列表中。
考虑一下您的排序结果集是否如下所示(使用整数而不是时间戳):
10
20
30
40
40
40
40
40
50
50
如果您在第一页上
limit(5)
,您将在中间将这批产品切成四个,所以您的第一页 5 看起来像这样:
10
20
30
40
40
现在,您想要获取 5 个文档的第二页,因此您传递了最后看到的值
startAfter(40)
。 这将跳过接下来的几个值为 40 的文档,并从 50 开始。因此,您的分页将完全跳过应该在列表中的几个文档。 这就是为什么您应该使用文档快照而不是字段值进行分页。 文档快照为您提供了正确结果页面的明确具体索引,而不会像这样丢失文档。