如何在Firebase Firestore中的多个字段上进行范围过滤?

时间:2018-08-01 09:23:23

标签: android ios firebase google-cloud-firestore

我知道基本上不允许在多个字段上执行范围过滤,例如以下代码:

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

我必须在一个查询中基于“ dateTimeStart”或仅基于“ price”进行过滤之间进行选择,但是我需要根据这两个条件进行过滤,这有什么技巧吗?我只是认为我只需要根据价格进行查询,然后查询结果就需要手动排序

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

1 个答案:

答案 0 :(得分:1)

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

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的新集合来复制数据,在其中应添加所有在price10之间具有1000且具有{{ 1}}在dateTimeStartstartTime之间。

请注意,对于Firebase,复制数据没有问题。这是一种非常普遍的做法,命名为finishTime,为此,我建议您观看此视频Denormalization is normal with the Firebase Database。它用于Firebase实时数据库,但相同的原理也适用于Cloud Firestore。

复制数据时,请记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您想更新/删除项目,则需要在它存在的每个位置进行。