Firestore分页-查询后如何查找是否有更多数据(使用限制)

时间:2019-12-19 21:08:35

标签: google-cloud-firestore

我们在当前的python 2.7标准环境中使用ndb数据存储。我们将这个应用程序迁移到具有Firestore(本机模式)的python 3.7标准环境中。

我们在ndb数据存储上使用分页,并使用访存来构造查询。

 query_results , next_curs, more_flag = query_structure.fetch_page(10)

next_curs和more_flag在指示当前查询之后(要获取10个元素)是否有更多数据要获取时非常有用。我们用它来标记“下一页” /“上一页”的前端。

我们在Firestore中找不到与之等效的产品。有人可以帮助实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

Firestore分页中没有直接等效项。相反,您可以做的是获取比该页面所需的N个文档多的一个文档,然后使用N + 1个文档的存在来确定是否存在“更多”。您将在显示的页面中省略N + 1文档,然后从该N + 1文档开始下一页。

答案 1 :(得分:0)

不久前,我构建了一个自定义的firestore API,以通过分页获取记录。您可以看一下repository。这是我经历的学习周期的故事:

我的第一个尝试是使用限制和偏移量,这似乎很吸引人,但是后来我遇到了一个问题,那就是最终获取20万条记录非常昂贵。因为使用偏移量时,Google还会向您收取之前所有记录的读取费用。 Google Firestore Pricing Page明确指出:

使用游标,页面令牌和 限制。实际上,这些功能可以帮助您通过阅读节省金钱 仅您实际需要的文件。

但是,当您发送包含偏移量的查询时, 为每个跳过的文档收费。例如,如果您的查询 使用10的偏移量,查询返回1个文档,您是 收取11次读取。由于这笔额外费用,您应该使用 光标而不是偏移量。

我的第二次尝试是使用光标最小化这些读取。我最终获取了N + 1个文档,并按如下所示放置了光标:

collection = 'my-collection'
cursor = 'we3adoipjcjweoijfec93r04' # N+1th doc id
q = db.collection(collection)
snapshot = db.collection(collection).document(cursor).get()
q = q.start_at(snapshot) # Place cursor at this document
docs = q.stream()

但是这需要更多代码,我认为可以更轻松地完成。那么为什么不获取N个文档,获取最后一个文档的ID并使用start_after函数呢?

collection = 'my-collection'
cursor = 'dkfjweoidkdfjowepp39jfe' # Nth doc id
q = db.collection(collection)
snapshot = db.collection(collection).document(cursor).get()
q = q.start_after(snapshot) # Place cursor after this document
docs = q.stream()