公司的FireStore多个范围查询公司的FireStore多个范围查询(Firestore mul

2019-05-12 13:23发布

比方说,我有车的集合,我想通过过滤它们price范围,并通过year的范围。 我知道,公司的FireStore有严格的限制,由于性能方面的原因,所以是这样的:

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

将抛出一个错误:

无效的查询。 所有其中具有一个不等式过滤器(<,<=,>,或> =)必须在同一字段中。

那么,有没有到本地数据管理执行这种查询的任何其他方式? 也许有些类型的索引或棘手的数据组织的?

Answer 1:

该错误消息和文件在此十分明了:一个公司的FireStore查询仅可以在单个字段执行范围滤波。 既然你要在两个过滤范围priceyear ,这是不可能在一个公司的FireStore查询。

周围有此两种常用方法:

  1. 执行查询过滤的一个领域,并在您的客户端代码的其他领域。
  2. 结合这两个范围的值到一个单一的领域以某种方式,让您的使用情况有一个字段。 这是令人难以置信的不平凡的,并且这种组合的唯一成功的例子,我知道的是使用geohashes到经度和纬度进行筛选。

鉴于这两个之间的工作不同,我建议你选择第一个选项。

第三个选择是你的数据不同的模型,使之更容易实现您的用例。 最直接的实现,这将是把所有的产品,从2015 - 2018年为一个单一的集合。 然后,你可以查询与该集合db.collection("products-2015-2018").where('price','>=', 70000).where('price','<=', 90000)

一个更普遍的替代方案是将产品存放每年为一个集合中,然后执行4个查询来获得你正在寻找的结果:每收集一个products-2015products-2016products-2017 ,和products-2018

我建议你阅读的复合查询和其局限性的文档 ,并看着云公司的FireStore查询视频 。



文章来源: Firestore multiple range query