Firestore多范围查询

时间:2018-06-02 15:56:05

标签: firebase nosql google-cloud-firestore

我们说我有一系列汽车,我希望按price范围和year范围过滤它们。我知道Firestore因性能原因有严格的限制,所以类似:

db.collection("products")
  .where('price','>=', 70000)
  .where('price','<=', 90000)
  .where('year','>=', 2015)
  .where('year','<=', 2018)

会抛出错误:

  

查询无效。所有具有不等式(&lt;,&lt; =,&gt;或&gt; =)的过滤器必须位于同一个字段上。

那么有没有其他方法可以在没有本地数据管理的情况下执行此类查询?也许某种索引或棘手的数据组织?

2 个答案:

答案 0 :(得分:4)

错误消息和文档非常清楚:Firestore查询只能对单个字段执行范围过滤。由于您尝试过滤priceyear上的范围,因此在单个Firestore查询中无法做到这一点。

有两种常见的方法:

  1. 对查询中的一个字段以及客户端代码中的另一个字段执行过滤。
  2. 以某种方式将两个范围的值合并为一个字段,以允许您的用例具有单个字段。这是非常重要的,我所知道的这种组合的唯一成功例子就是使用地理位置来过滤纬度和经度。
  3. 鉴于这两者之间的努力不同,我建议选择第一个选项。

    第三种选择是以不同方式对数据建模,以便更容易实现您的用例。最直接的实施方式是将2015-2018所有产品整合到一个系列中。然后,您可以使用db.collection("products-2015-2018").where('price','>=', 70000).where('price','<=', 90000)查询该集合。

    更常见的替代方法是将产品存储在每年的集合中,然后执行4次查询以获得您正在寻找的结果:每个集合中的一个products-2015,{{1 }},products-2016products-2017

    我建议您阅读document on compound queries and their limitations,并观看video on Cloud Firestore queries

答案 1 :(得分:1)

Flutter 中,你可以做这样的事情,

final _queryList = await db.collection("products").where('price','>=', 70000).get();
final _docL1 = _querList.where('price','<=', 90000);

它肯定会起作用。