带有时间戳的 Firestore 快照游标与文档

问题描述 投票:0回答:1

我的应用程序中有一个无限滚动列表。页面加载时,我订阅最初的 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。

文档似乎也倾向于不传递日期,而是传递整个最后一个文档快照作为查询游标。为什么这更好,这是否解决了第一种方法存在的任何问题?

注意:当您滚动列表时,可以添加新项目并需要显示在列表中。

firebase google-cloud-firestore
1个回答
0
投票

考虑一下您的排序结果集是否如下所示(使用整数而不是时间戳):

10
20
30
40
40
40
40
40
50
50

如果您在第一页上

limit(5)
,您将在中间将这批产品切成四个,所以您的第一页 5 看起来像这样:

10
20
30
40
40

现在,您想要获取 5 个文档的第二页,因此您传递了最后看到的值

startAfter(40)
。 这将跳过接下来的几个值为 40 的文档,并从 50 开始。因此,您的分页将完全跳过应该在列表中的几个文档。 这就是为什么您应该使用文档快照而不是字段值进行分页。 文档快照为您提供了正确结果页面的明确具体索引,而不会像这样丢失文档。

© www.soinside.com 2019 - 2024. All rights reserved.