firebase - 在 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 会出现异常。
解决方案
无论您用于构建应用程序的平台是什么,我确信您得到的错误是非常明确的。Cloud Firestore 官方文档对此主题也非常明确。因此,对于 Firestore,存在一些查询限制:
Cloud Firestore 不支持以下类型的查询:
- 逻辑或查询。在这种情况下,您应该为每个 OR 条件创建一个单独的查询,并在您的应用程序中合并查询结果。
因此,Firestore 查询只能对单个属性执行范围过滤。由于您尝试过滤两个属性的范围,因此您会收到该错误消息,这是预期的行为,因为这在单个 Firestore 查询中是不可能的。
要解决此问题,您可以选择以下解决方案之一:
您可以在查询中的一个(第一个)字段和客户端的另一个(第二个)字段上执行过滤,正如官方文档所示。
您可以通过某种方式将两个范围的值组合到一个字段中,从而使您的用例具有单个字段。这种组合的一个非常成功的例子是使用 geohashes 来过滤纬度和经度属性,正如 Frank van Puffelen 在这段视频 Querying Firebase 和 Firestore中很好地解释的那样。
另一种选择是更改存储数据的方式并对其进行不同的建模。最简单的实现是将所有项目放入
startDate
和endDate
到一个集合中。由于您没有为平台选择标签,我将用 Javascript 编写必要的查询,但也可以简单地为其他编程语言编写。因此,您可以使用以下查询查询该集合:db.collection("startDate-endDate").where('date','>=', start).where('date','<=', end);
另一种更通用的选择是将所有项目分别存储在您需要的每个时期(年、月或日)的集合中,然后执行必要数量的查询以获取您正在寻找的每个集合中的一个项目,
itemsFromFirstYear
,itemsFromSecondYear
等等。
另请查看有关以下内容的官方文档:
恕我直言,我建议选择第一个选项。
推荐阅读
- android - 捕获的图像可以保存到图像文件夹,但不能保存到应用程序文件夹
- asp.net-mvc - 在 Asp.net Mvc 的局部视图中显示模态
- android - 从智能手机向 Wear OS 智能手表发送通知
- android - Android Room:自动增量字段
- android - 从互联网上获取当前时间是一种好习惯吗?
- java - 填充有 Firebase 数据库的 Android 微调器未选择该项目
- spring-mvc - 什么时候调用 DispatcherServlet 的 onRefresh 方法?
- python - 使用 Python - 设置列表来存储 30 个学生姓氏以及 test1 和 test2 的测试分数,这两个分数都是 50
- matlab - 如何使用图形作为函数来获得输出?
- javascript - 如何在 Angular CLI 6 项目中添加 js 库?