android - 如何在 Firebase Firestore 中的多个字段上制作范围过滤器?
问题描述
我知道基本上不允许像下面的代码对多个字段执行范围过滤器:
eventRef
.whereField("dateTimeStart", isGreaterThan: startTime)
.whereField("dateTimeStart", isLessThan: finishTime)
.whereField("price", isGreaterThan: 10)
.whereField("price", isLessThan: 1000)
我必须在一个查询中选择基于“dateTimeStart”或仅“价格”执行过滤器,但我需要根据这两个条件进行过滤,有什么技巧可以做到这一点吗?我只能认为我必须只根据价格进行查询,然后需要手动对查询结果进行排序
有没有比这种方法更好的选择?
解决方案
当您在代码中使用查询时,您肯定会得到一个听起来像这样的错误:
Caused by: java.lang.IllegalArgumentException: All where filters other than whereEqualTo() must be on the same field. But you have filters on 'dateTimeStart' and 'price'
因此,Firestore 无法whereEqualTo()
在多个属性上使用函数。在这种情况下,您应该考虑扩充您的数据结构以允许反向查找。因此,您应该通过创建一个名为的新集合来复制数据priceAndPeriod
,您应该在其中添加所有具有price
between 10
and1000
并且还具有dateTimeStart
between startTime
and的产品finishTime
。
请注意,对于 Firebase,复制数据没有问题。这是一种非常常见的做法,denormalization
为此,我建议您观看此视频,Firebase 数据库的非规范化是正常的。它适用于 Firebase 实时数据库,但同样的原则适用于 Cloud Firestore。
复制数据时,需要牢记一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。
推荐阅读
- c# - 哪个 C# 库用于使用 QPID 队列
- typescript - Lodash at() 方法在 ts 文件中不起作用(在 .js 中起作用)
- entity-framework - 恢复 DbContext.Savechanges 以防第二个 DbContext.Savechanges 失败
- rust - rust 中的递归问题
- javascript - 将 Vuetify v-stepper 与 Vue 路由器动态集成
- c# - 应该如何测试可变字典值的相等性?
- excel - 如何在范围内的单个单元格中输入值并继续遍历范围内的每个单元格
- apache-spark - 如何使用 SPARK 将多个 parquet 文件转换为 TFrecord 文件?
- postgresql - Postgres 使用数据字典表生成 sql 输出
- adyen - Adyen drop-in Checkout SDK 验证失败