Bri*_*den 2 firebase google-cloud-firestore
我有带有startDate和 的文档endDate。startDate我想查询和之间的范围endDate。我可以在一个日期的范围之间查询,如下所示:
whereField("startDate", isGreaterThan: start).whereField("startDate, isLessThan: end)
Run Code Online (Sandbox Code Playgroud)
但我无法像这样查询两个字段:
whereField("startDate", isGreaterThan: start).whereField("endDate", isLessThan: end)
Run Code Online (Sandbox Code Playgroud)
在复合 where 语句中使用多个字段时,Firestore 会发生异常。
编辑: 2023-03-27
Firestore 现在支持逻辑 OR 查询。现在,您可以对多个字段执行 OR 查询。该选项从 Cloud Firestore 版本24.4.5开始可用。
在代码中,它会很简单:
val db = Firebase.firestore
val citiesRef = db.collection("cities")
val query = citiesRef.where(Filter.or(
Filter.equalTo("capital", true),
Filter.greaterThanOrEqualTo("population", 1000000)
))
Run Code Online (Sandbox Code Playgroud)
capital这将返回被设置为OR 的文档true,以及人口大于或等于 的文档1_000_000。
无论您使用什么平台来构建应用程序,我确信您收到的错误都是非常明确的。Cloud Firestore 官方文档对于这个主题也非常明确。因此,当涉及到 Firestore 时,存在一些查询限制:
Cloud Firestore 不支持以下类型的查询:
- 逻辑或查询。在这种情况下,您应该为每个 OR 条件创建一个单独的查询,并将查询结果合并到您的应用程序中。
因此,Firestore 查询只能对单个属性执行范围过滤。由于您尝试过滤两个属性的范围,因此您会收到该错误消息,这是预期的行为,因为这在单个 Firestore 查询中是不可能的。
要解决此问题,您可以选择以下解决方案之一:
您可以对查询中的一个(第一个)字段和客户端的另一个(第二个)字段执行过滤,正如官方文档所示。
您可以通过某种方式将两个范围的值合并到一个字段中,从而允许您使用单个字段的用例。这种组合的一个非常成功的例子是使用 geohashes 来过滤纬度和经度属性,Frank van Puffelen 在这段视频“查询 Firebase 和 Firestore”中对此进行了很好的解释。
另一种选择是改变存储数据的方式并以不同的方式对其进行建模。最简单的实现是将startDate和中的所有项目endDate放入一个集合中。由于您没有为平台选择标签,因此我将用 Javascript 编写必要的查询,但也可以简单地为其他编程语言编写它。因此,您可以使用以下查询来查询该集合:
db.collection("startDate-endDate").where('date','>=', start).where('date','<=', end);
Run Code Online (Sandbox Code Playgroud)
另一种更通用的替代方法是将您需要的每个时期(年、月或日)的所有项目分别存储在集合中,然后执行必要数量的查询以获取您正在寻找每个集合中的项目,itemsFromFirstYear,itemsFromSecondYear等等。
另请查看有关以下内容的官方文档:
恕我直言,我建议选择第一个选项。
| 归档时间: |
|
| 查看次数: |
1527 次 |
| 最近记录: |