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}