Firestore多范围查询

Dmi*_*nko 4 nosql firebase google-cloud-firestore

假设我有一些汽车,我想按price范围和year范围过滤它们。我知道由于性能原因,Firestore具有严格的限制,因此类似:

db.collection("products")
  .where('price','>=', 70000)
  .where('price','<=', 90000)
  .where('year','>=', 2015)
  .where('year','<=', 2018)
Run Code Online (Sandbox Code Playgroud)

会抛出一个错误:

查询无效。不等式(<,<=,>或> =)的所有过滤器都必须位于同一字段上。

那么,有没有其他方法可以执行这种查询而无需本地数据管理?也许是某种索引或棘手的数据组织?

Fra*_*len 9

错误消息和文档对此非常明确:Firestore查询只能在单个字段上执行范围过滤。既然你要在两个过滤器的范围priceyear,这是不可能在一个公司的FireStore查询。

有两种常见的解决方法:

  1. 在查询中的一个字段上以及客户端代码中的另一个字段上执行筛选。
  2. 通过某种方式将两个范围的值合并到一个字段中,以使用例可以使用一个字段。这是非常重要的,而且我所知道的这种组合的唯一成功示例是使用地理哈希值过滤纬度和经度。

考虑到这两者之间的工作差异,我建议选择第一个选项。

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

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

我建议阅读有关复合查询及其限制文档,并观看有关Cloud Firestore查询视频

  • 是的,第一个看起来是最常见的解决方案(根据我之前用谷歌搜索的内容),但它似乎并没有真正的可扩展性。假设您有分页 - 20results/query(Q1) 并且有一个变化,这 20 个结果都不会匹配本地过滤器 (Q2),因此您需要重复 Q1 n 次,直到匹配 Q2 20 次。如果您有 100k 文档,则有机会发出 100k/20 个请求,这与性能无关。 (4认同)
  • 是的,我只是想100%确保我没有错过任何好的解决方法:) (2认同)