Cloud Firestore:现在可以使用 2 个以上字段的复合范围查询吗?
Cloud Firestore : Is compound range query in more than 2 fields available now?
我需要像这样获取远程数据。
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”)
我需要像这样获取远程数据。
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”)