在StartDate和EndDate Firestore之间

问题描述 投票:0回答:1

我有startDateendDate的文件。我想查询startDateendDate的范围。我可以查询一个日期的范围,如下所示:

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

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

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

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

firebase google-cloud-firestore
1个回答
1
投票

无论您使用什么平台构建应用程序,我都确定您获得的错误非常明确。关于此主题,Cloud Firestore官方文档也非常明确。所以当涉及到Firestore时,有一些query limitations

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

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

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

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

  • 您可以在查询中的一个(第一个)字段和另一个(第二个)字段客户端上执行过滤,正如官方文档所示。
  • 您可以通过某种方式将两个范围的值组合到一个字段中,从而允许您的用例具有单个字段。这种组合的一个非常成功的例子是使用地理位置来过滤纬度和经度属性,正如Frank van Puffelen在这个视频中所解释的那样,Querying Firebase and Firestore
  • 另一个选择是更改存储数据的方式并以不同方式对其进行建模。最简单的实现是将startDateendDate中的所有项目放入单个集合中。由于您没有为平台选择标记,我将在Javascript中编写必要的查询,但也可以简单地为其他编程语言编写。因此,您可以使用以下查询查询该集合: db.collection("startDate-endDate").where('date','>=', start).where('date','<=', end);
  • 另一个更常见的替代方案是将所有项目分别存储在您需要的每个周期(年,月或日)的集合中,然后执行必要数量的查询以获取您正在寻找每个集合之一的项目, itemsFromFirstYearitemsFromSecondYear等。

请参阅以下官方文档:

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

© www.soinside.com 2019 - 2024. All rights reserved.