Google cloud firestore Firestore按偏移量分页

Google cloud firestore Firestore按偏移量分页,google-cloud-firestore,Google Cloud Firestore,我想创建两个带有分页选项的查询。第一个我想得到前十条记录,第二个我想得到其他所有记录: .startAt(0) .limit(10) .startAt(9) .limit(null) 有人能确认上述代码对这两种情况都正确吗?Firestore不支持基于索引或偏移量的分页。您的查询将无法处理这些值 请仔细阅读报告。分页要求您提供定义要查询的下一页的文档引用(或该文档中的字段值)。这意味着您的分页通常从查询结果的开头开始,然后使用上一页中看到的最后一个文档进行分页。如Doug所述,Firesto

我想创建两个带有分页选项的查询。第一个我想得到前十条记录,第二个我想得到其他所有记录:

.startAt(0)
.limit(10)

.startAt(9)
.limit(null)

有人能确认上述代码对这两种情况都正确吗?

Firestore不支持基于索引或偏移量的分页。您的查询将无法处理这些值


请仔细阅读报告。分页要求您提供定义要查询的下一页的文档引用(或该文档中的字段值)。这意味着您的分页通常从查询结果的开头开始,然后使用上一页中看到的最后一个文档进行分页。

如Doug所述,Firestore不支持索引/偏移-但您可以使用它所支持的组合来获得类似的效果

Firestore有自己的内部排序顺序(通常是document.id),但任何查询都可以排序.orderBy(),并且第一个文档将与该排序相关-只有orderBy()查询具有“0”位置的真正概念

Firestore还允许您限制返回的文档数量。限制(n)

.endAt()、.endBefore()、.startAt()、.startBefore()都需要与orderBy具有相同字段的对象,或者需要DocumentSnapshot,而不是索引

我要做的是创建一个查询:

const MyOrderedQuery = FirebaseInstance.collection().orderBy()
然后首先执行

MyOrderedQuery.limit(n).get()

它将以一种方式或另一种方式返回QuerySnapshot,其中将包含一个DocumentSnapshot数组。让我们保存该数组

let ArrayOfDocumentSnapshots = QuerySnapshot.docs;
警告威尔·罗宾逊!javascript设置通常是通过引用, 即使使用了很浅的扩展运算符,也要确保您的代码是真实的 复制完整的深层结构或保留引用

然后,要按照您上面的要求获取“其余”文档,我将执行以下操作:

MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).get()

它将在第一个查询的最后一个返回的文档快照之后启动。注意MyOrderedQuery的重用

通过如上所述保存有序查询,然后重复使用返回的快照和原始查询,可以获得类似“分页”的结果

MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).limit(n).get() // page forward
MyOrderedQuery.endBefore(ArrayOfDocumentSnapshots[0]).limit(n).get() // page back
这确实使您的状态管理更加复杂-您必须保留有序查询和最后返回的QuerySnapshot-但是,现在您正在分页

大钞 这不是非常有效——对于Firestore来说,设置侦听器相当“昂贵”,所以您不想经常这样做。根据您的文档大小,您可能希望“侦听”集合的较大部分,并在本地处理更多的分页(Redux或其他内容)-Firestore文档表明您希望侦听器至少在30秒左右以提高效率。对于某些应用程序,即使是10页也可能是有效的;对于其他人,您可能需要在本地存储500个或更多,并在较小的卡盘中分页。

来自:


指定返回结果的偏移量。

使用此命令时是否收到任何错误消息?否,我尚未测试它。只是想确保光标位置在startAt从0开始,并将null传递到limit。嗨,Doug,当我研究同一主题时,我发现下面的文档显示了在firestore admin中使用偏移量跳过文档的示例:。我是否正确地理解它已经可用,并且不知道是否可以使用它?我想我在某个地方看到,offset仍然会首先读取每个文档,以计算“开始”文档,从而产生额外的费用,建议使用DocumentSnapshot进行分页。感谢您在这方面的投入。@pawello2222感谢您让我的回答更全面。
MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).onSnapshot()
MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).limit(n).get() // page forward
MyOrderedQuery.endBefore(ArrayOfDocumentSnapshots[0]).limit(n).get() // page back
offset(offset) → {Query}