我有一个使用Firestore的android应用程序,我需要对大量(>1000)文档进行计算。通常,在查询响应中,数据库会指定一些元数据来指示查询是否返回了所有结果,或者仅指定了一部分带有分页令牌的部分,用于通过后续请求检索结果。
从Firestore文档中可以看出,所有这些都没有,只是查询结果仅限于单个查询的10 of。这是怎么执行的?它会返回客户端错误吗?它会只返回一个截断的结果吗?我是否需要应用我自己的限制,然后当我不知道这些文档的确切大小时,我如何才能知道合理的限制是什么?
我的问题基本上是如何对可能超过单一查询限制的大量文档进行查询?
发布于 2021-06-30 06:03:34
如何对可能超过单个查询限制的大型文档集运行查询?
我能想到的最好的解决方案是创建一个替代结构并复制一些数据。由于1000个结果的查询可能超出了限制,所以应该考虑创建如下所示的另一个集合:
Firebase-root
|
--- revenues (collection)
|
--- May 2021 (document)
| |
| --- [{May 17, 2021 at 7:51:42 PM UTC+3: 123.33},
| {May 18, 2021 at 3:36:11 PM UTC+3: 444.74}]
|
--- June 2021 (document)
|
--- [{June 11, 2021 at 3:12:22 PM UTC+3: 523.18},
{June 23, 2021 at 2:39:54 PM UTC+3: 253.14}]如您所见,我创建了一个名为“收入”的新集合,其中包含了一年中每个月的文档。每个文档都包含一个数组,其中包含键值对,其中键是日期,值是发票的总金额。如您所见,在我的例子中,我每个月只添加两张发票。但是,如果只存储上述数据(日期/数量),则可以在单个数组中存储更多的1000多张发票,这意味着您可以保持在1 max文档大小限制以下。
因为用户选择了开始日期和结束日期,所以您将始终知道应该从哪个文档开始,以及应该以哪个文档结束。因此,在这个解决方案中,您将计算客户端的收入。例如,如果要计算2021年5月17日至2021年6月23日期间的全部收入,则必须同时阅读文档,并只对这些日期之间存在的元素进行求和。与阅读1000个文档来获得总收入(我认为这有点昂贵)不同,您只需要阅读两个文档,假设一个文档可能包含1000个发票。
这种做法也称为去正规化,对于Firebase来说,这是一种常见的做法。如果您是NoSQL数据库的新手,我建议您查看此视频,在Firebase数据库中,取消规范化是正常的以获得更好的理解。它适用于Firebase实时数据库,但同样的规则适用于。
另外,当您复制数据时,您需要记住一件事。同样,您要添加数据,需要对其进行维护。换句话说,如果您想更新/删除发票,您需要在它存在的每一个地方都这样做。
欲了解更多信息,请参见以下文章中我的回答:
如果您想直接将云中的对象数组映射到自定义对象的列表中,请从以下URL查看我的文章:
如果您也想实现分页,请从下面的帖子中查看我的答案:
通过将查询游标与limit()方法组合在一起,可以对查询进行分页。这有点老了,但我也建议您看看这个视频,以便更好地理解它。
如果您需要按一下按钮分页,请在下面回答:
发布于 2021-06-29 01:22:54
一般情况下,您最多希望检索普通用户可能看到的文档数量。如果通常在“筛选器”中度量这一点,那么我将确定屏幕上适合的文档数量,然后首先检索2或3倍的文档。
然后,您可以实现按需加载/无休止滚动,当用户接近您已经拥有的数据的末尾时,自动加载更多的文档,您可以为他们添加一个显式的“加载更多”按钮来触发加载,或者您可以告诉他们可能有更多的文档,他们应该为他们正在寻找的东西指定更具体的标准。
https://stackoverflow.com/questions/68170494
复制相似问题