比方说,我有车的集合,我想通过过滤它们price
范围,并通过year
的范围。 我知道,公司的FireStore有严格的限制,由于性能方面的原因,所以是这样的:
db.collection("products")
.where('price','>=', 70000)
.where('price','<=', 90000)
.where('year','>=', 2015)
.where('year','<=', 2018)
将抛出一个错误:
无效的查询。 所有其中具有一个不等式过滤器(<,<=,>,或> =)必须在同一字段中。
那么,有没有到本地数据管理执行这种查询的任何其他方式? 也许有些类型的索引或棘手的数据组织的?
该错误消息和文件在此十分明了:一个公司的FireStore查询仅可以在单个字段执行范围滤波。 既然你要在两个过滤范围price
和year
,这是不可能在一个公司的FireStore查询。
周围有此两种常用方法:
- 执行查询过滤的一个领域,并在您的客户端代码的其他领域。
- 结合这两个范围的值到一个单一的领域以某种方式,让您的使用情况有一个字段。 这是令人难以置信的不平凡的,并且这种组合的唯一成功的例子,我知道的是使用geohashes到经度和纬度进行筛选。
鉴于这两个之间的工作不同,我建议你选择第一个选项。
第三个选择是你的数据不同的模型,使之更容易实现您的用例。 最直接的实现,这将是把所有的产品,从2015 - 2018年为一个单一的集合。 然后,你可以查询与该集合db.collection("products-2015-2018").where('price','>=', 70000).where('price','<=', 90000)
一个更普遍的替代方案是将产品存放每年为一个集合中,然后执行4个查询来获得你正在寻找的结果:每收集一个products-2015
, products-2016
, products-2017
,和products-2018
。
我建议你阅读的复合查询和其局限性的文档 ,并看着云公司的FireStore查询视频 。