【问题标题】:Firestore pagination of multiple queries多个查询的 Firestore 分页
【发布时间】:2020-02-05 21:02:34
【问题描述】:

在我的例子中,有 10 个字段,所有字段都需要通过 "or" 搜索,这就是为什么我使用多个查询并使用 Promise.all() 在客户端过滤常见项目。

问题是我想实现分页。我不想得到每个查询的所有结果,这有太多的“读取”成本。但是我不能对每个查询使用.limit(),因为我想要限制“最终结果”。

例如,我想得到10个查询结果中的前50个常见结果,如果我对每个查询都做limit(50),最终的结果可能会小于50。

有人对多个查询的分页有想法吗?

【问题讨论】:

  • 您可以按顺序加载子集,直到获得正确数量的结果。
  • @FrankvanPuffelen 是的,我现在所做的就像你提到的那样。但缺点是,例如,我想得到 50 条结果,每次查询 200 条记录,直到得到 50 条。如果幸运的话,我会通过几次顺序查询得到结果,但有时需要超过 10 次,因为数据的分布是随机的。无论如何,它现在不漂亮但可行。

标签: google-cloud-firestore


【解决方案1】:

我认为实现这一目标的最佳方式是使用查询游标,这样您就可以更好地管理从搜索中检索到的数据。

我建议您查看以下链接,以了解更多信息 - 包括社区回答的问题,这似乎与您的情况相似。

如果这些信息对您有帮助,请告诉我!

【讨论】:

  • 感谢您的回答。游标可以提供帮助。但是您提供的链接与我的情况不太匹配。就我而言,有 10 个单独的查询。在他们返回结果后,我会做一个本地过滤器来获得他们之间的共同结果,如果共同结果没有达到我需要的数量,我会继续去下一个子集,直到我得到正确数量的结果。但由于数据的分布,“时间”和“读取”成本无法控制。
  • 嗨@yuehengshi 当然,我明白了。我发现了一些可能对您有所帮助的附加链接,否则,可能继续使用子集将是您的最佳选择。链接如下:here 和 here
  • @gso_gabriel 感谢您的链接。我想我仍然需要继续使用子集。
【解决方案2】:

不确定它是否相关,但我认为我遇到了类似的问题,并提出了 4 种可能是解决方法的方法。

  1. 而不是进行 10 次查询,而是获取与单个选择过滤器匹配的所有产品,例如类别(在我的情况下,客户只能设置一个类别字段)。并在客户端进行所有过滤。使用这种方法,应用程序仍然可以一次读取大量文档,但至少在会话期间重复使用这些文档,并且比 firestore 的严格规则更灵活地进行过滤。

  2. 在服务器环境中运行多个查询,例如使用 Node.js 的云存储功能,并仅获取与所有过滤器匹配的前 50 个文档。使用这种方法,客户端只接收到需要的数据不多,但服务器仍然读取很多。

  3. 这实际上是您的方法与接受的答案相结合

  4. 借助云功能在 Firebase 中创建自动化文档,例如颜色:{red:[product1ID,product2ID....], ....} 仅存储文档 ID,并根据过滤器在服务器端使用云功能获取相应的文档,创建匹配数组的叉积(AND 逻辑)并将它的前 50 个元素推送到客户端。知道哪些产品要显示客户端然后处理获取客户端库。

希望这些会有所帮助。这是我的原帖Firestore multiple `in` queries with `and` logic, query structure

【讨论】:

  • 感谢您的回答!我认为最后一个对我来说是一个很好的尝试,创建一些索引会在查询时有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2021-08-17
  • 2019-11-14
  • 1970-01-01
  • 2018-05-18
  • 2023-03-09
  • 2019-04-05
相关资源
最近更新 更多