Firestore关系数据模型

时间:2018-09-23 06:18:13

标签: java android firebase google-cloud-firestore

我正在学习在Android上使用Cloud Firestore,到目前为止,我无法找到某些问题的答案。

  1. 是否可以通过指定ID或引用列表来检索文档列表,而无需对每个ID进行单独的查询?到目前为止,似乎不可能。
  2. 查询文档时是否可以在文档字段中包含参考对象,而无需对该参考对象进行第二次查询?看来您目前无法。
  3. 我有一个商店根集合和该商店中物品的单独根集合。我希望能够按指定的商品对最便宜的商店进行分类。但是我有一个问题,因为如果我按价格对商品进行排序并且得到1000个结果,那么我需要执行1000个查询来检索包含这些商品的实际商店。我将如何优化呢?

我不确定是否应该为此创建3个单独的SO问题,因此我只将它们放在一个中。让我知道这是否是错误的方法。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 是否可以通过指定ID或引用列表来检索文档列表,而无需对每个ID进行单独的查询?到目前为止,似乎不可能。
  2.   

是的,有可能。任务的whenAllSuccess方法(和其他whenAll方法)将任务的结果按传递给List方法的顺序,以whenAllSuccess()的形式将任务的结果传递给回调。因此,如您在官方文档中所见,您可以将Collection<? extends Task<?>>作为参数传递。 Here 是使用引用进行此操作的示例。

  
      
  1. 查询文档时是否可以在文档字段中包含参考对象,而无需对该参考对象进行第二次查询?看来您目前无法。
  2.   

是的,有可能。上面示例的答案就是这样。如果要使用单独的查询,还可以查看另一种方法 here 。您还将获得一个列表。

  
      
  1. 我有一个商店根集合和该商店中物品的单独根集合。我希望能够按指定的商品对最便宜的商店进行分类。但是我有一个问题,因为如果我按价格对商品进行排序并且得到1000个结果,那么我需要执行1000个查询来检索包含这些商品的实际商店。我将如何优化呢?
  2.   

Firestore中的查询很浅:它们仅从运行查询的集合中获取项目。无法通过单个查询从顶级集合以及其他集合或子集合中获取文档。 Firestore一步不支持跨不同集合的查询。单个查询只能使用单个集合中的文档属性。因此,要解决此问题,您需要向每个产品添加一个新属性,该属性实际上应该是商店的ID。要获得所有带有最便宜商品的商店,您应该查询商品集合,获取最便宜的商品,然后再次查询以获取该商品所属商店的数据。

编辑:

通常,人们高估了他们将获得的使用量。所以(一般而言),我再次建议您不要担心优化,直到您真正需要它为止。但是,对于#1,是的,它会执行很多查询,但这就是在Firestore中可以做到的方式。但是不用担心,Firestore在这种情况下工作得很好。关于#2和#3,不,它不会执行查询串联,但是即使您使用两个查询,它也可以非常快速地工作。嵌套侦听器没有错。