首页 > 解决方案 > 在 StartDate 和 EndDate Firestore 之间

问题描述

我有带有startDate和的文件endDate。我想在startDate和的范围之间进行查询endDate。我可以像这样查询一个日期的范围:

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

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

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

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

标签: firebasegoogle-cloud-firestore

解决方案


无论您用于构建应用程序的平台是什么,我确信您得到的错误是非常明确的。Cloud Firestore 官方文档对此主题也非常明确。因此,对于 Firestore,存在一些查询限制

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

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

因此,Firestore 查询只能对单个属性执行范围过滤。由于您尝试过滤两个属性的范围,因此您会收到该错误消息,这是预期的行为,因为这在单个 Firestore 查询中是不可能的。

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

  • 您可以在查询中的一个(第一个)字段和客户端的另一个(第二个)字段上执行过滤,正如官方文档所示。

  • 您可以通过某种方式将两个范围的值组合到一个字段中,从而使您的用例具有单个字段。这种组合的一个非常成功的例子是使用 geohashes 来过滤纬度和经度属性,正如 Frank van Puffelen 在这段视频 Querying Firebase 和 Firestore中很好地解释的那样。

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

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

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

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


推荐阅读