我们说我有一系列汽车,我希望按price
范围和year
范围过滤它们。我知道Firestore因性能原因有严格的限制,所以类似:
db.collection("products")
.where('price','>=', 70000)
.where('price','<=', 90000)
.where('year','>=', 2015)
.where('year','<=', 2018)
会抛出错误:
查询无效。所有具有不等式(&lt;,&lt; =,&gt;或&gt; =)的过滤器必须位于同一个字段上。
那么有没有其他方法可以在没有本地数据管理的情况下执行此类查询?也许某种索引或棘手的数据组织?
答案 0 :(得分:4)
错误消息和文档非常清楚:Firestore查询只能对单个字段执行范围过滤。由于您尝试过滤price
和year
上的范围,因此在单个Firestore查询中无法做到这一点。
有两种常见的方法:
鉴于这两者之间的努力不同,我建议选择第一个选项。
第三种选择是以不同方式对数据建模,以便更容易实现您的用例。最直接的实施方式是将2015-2018所有产品整合到一个系列中。然后,您可以使用db.collection("products-2015-2018").where('price','>=', 70000).where('price','<=', 90000)
查询该集合。
更常见的替代方法是将产品存储在每年的集合中,然后执行4次查询以获得您正在寻找的结果:每个集合中的一个products-2015
,{{1 }},products-2016
和products-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);
它肯定会起作用。