【问题标题】:how to make Range filters on multiple field in Firebase Firestore? [duplicate]如何在 Firebase Firestore 中的多个字段上制作范围过滤器? [复制]
【发布时间】:2019-01-08 19:31:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您获取所有记录并保存在列表中,然后您可以对记录做任何事情,那就更好了

标签: android ios firebase google-cloud-firestore


【解决方案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 的新集合来复制数据,您应该在其中添加所有具有101000 之间的price 并且还具有介于startTime 和@987654330 之间的dateTimeStart 的产品@。

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

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

【讨论】:

  • 嗨,你试过我上面的解决方案了吗?
  • 嗨莎拉!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!
猜你喜欢
  • 2016-09-09
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
相关资源
最近更新 更多