首页 > 解决方案 > 如何在 Firebase Firestore 中的多个字段上制作范围过滤器?

问题描述

我知道基本上不允许像下面的代码对多个字段执行范围过滤器:

eventRef
    .whereField("dateTimeStart", isGreaterThan: startTime)
    .whereField("dateTimeStart", isLessThan: finishTime)
    .whereField("price", isGreaterThan: 10)
    .whereField("price", isLessThan: 1000)

我必须在一个查询中选择基于“dateTimeStart”或仅“价格”执行过滤器,但我需要根据这两个条件进行过滤,有什么技巧可以做到这一点吗?我只能认为我必须只根据价格进行查询,然后需要手动对查询结果进行排序

有没有比这种方法更好的选择?

标签: androidiosfirebasegoogle-cloud-firestore

解决方案


当您在代码中使用查询时,您肯定会得到一个听起来像这样的错误:

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,您应该在其中添加所有具有pricebetween 10and1000并且还具有dateTimeStartbetween startTimeand的产品finishTime

请注意,对于 Firebase,复制数据没有问题。这是一种非常常见的做法,denormalization为此,我建议您观看此视频,Firebase 数据库的非规范化是正常的。它适用于 Firebase 实时数据库,但同样的原则适用于 Cloud Firestore。

复制数据时,需要牢记一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。


推荐阅读