我需要获得这样的范围数据。
ex) 10 < a < 20 , 30 < b < 40
a和b这两个字段现在都是索引键。
我认为在这种情况下,复合范围查询是一种简单的方法。
但在Cloud Firestore中,范围查询只能用于一个字段。
ex) (possible) citiesRef.where("state", "==", "CA").where("population", "<", 1000000)
(impossible) citiesRef.where("state", ">=", "CA").where("population", ">", 100000)
如何在2个字段中进行范围查询?
在编写时,这在Cloud Firestore中是不可能的,而且可能永远都不可用。不过,根据您的需求,可以通过稍微重新思考数据模型和查询来解决问题。
选项1:预先计算范围
在此选项中,您可以添加一个名为population_bracket
的字段。在这里,您基本上将总体值放入一个可以测试的括号中。根据您的需要手动决定范围,或者使用一些自动方法,如ceil(log(population))
例如,CA的总体数量大约为39250000,因此使用日志方法ceil(log(population))
,我们得到8,这是我们存储在population_bracket
中的内容。如果我们同意将总体范围过滤器更改为<= 1000000
,那么我们可以使用population_bracket == 6
对总体过滤器进行简单的相等性检查。CA被正确排除在外!
选项2:客户端筛选器
在这个选项中,你可以根据需要猜测哪个范围过滤器会最大程度地减少结果集,然后简单地对第二个过滤器的结果进行客户端过滤(例如,忽略每个状态<"CA")