在StartDate和EndDate Firestore之间

时间:2019-04-03 05:15:13

标签: firebase google-cloud-firestore

我有startDateendDate的文档。我想在startDateendDate的范围之间进行查询。我可以像这样查询一个日期范围:

whereField("startDate", isGreaterThan: start).whereField("startDate, isLessThan: end)

但是我不能这样查询两个字段:

whereField("startDate", isGreaterThan: start).whereField("endDate", isLessThan: end)

在复合where语句中使用多个字段时,Firestore会通过一个异常。

1 个答案:

答案 0 :(得分:1)

无论您使用什么平台来构建应用程序,我都可以肯定您得到的错误是非常明显的。关于该主题,Cloud Firestore官方文档也非常明确。因此,在Firestore中有一些query limitations

  

Cloud Firestore不支持以下类型的查询:

     
      
  • 逻辑或查询。在这种情况下,您应该为每个OR条件创建一个单独的查询,然后将查询结果合并到您的应用中。
  •   

因此,Firestore查询只能对单个属性执行范围过滤。由于您尝试过滤两个属性上的范围,因此您正在处理该错误消息,这是预期的行为,因为在单个Firestore查询中无法做到这一点。

要解决此问题,您可以选择以下解决方案之一:

  • 您也可以对查询中的一个( first )字段和客户端的另一(第二个)字段进行过滤,正如官方文档所指出的那样。

    < / li>
  • 您可以通过某种方式将两个范围的值组合到一个字段中,以使用例具有一个字段。这种组合的一个非常成功的例子是使用地理哈希过滤经纬度属性,正如弗兰克·范·普菲伦(Frank van Puffelen)在这段视频Querying Firebase and Firestore中讲得很好。

  • 另一个选择是更改存储数据的方式并以不同的方式对其进行建模。最简单的实现是将startDateendDate中的所有项目放入单个集合中。由于您没有为平台选择标签,因此我将用Javascript编写必要的查询,但是对于其他编程语言也可以简单地编写该查询。因此,您可以使用以下查询来查询该集合:

    db.collection("startDate-endDate").where('date','>=', start).where('date','<=', end);
    
  • 另一个更通用的选择是将您需要的每个时期(年,月或日)分别存储在集合中的所有项目,然后执行必要数量的查询以获取要查找的项目对于每个集合之一itemsFromFirstYearitemsFromSecondYear等。

还请查看有关以下内容的官方文档:

恕我直言,我建议选择第一个选项。