我想查询存储在名为“用户”的集合中的用户。每个用户都有年龄和体重等字段。有没有一种方法可以按与使用GeoFire运行搜索的用户之间的距离来查询用户,并将其与FireStore搜索查询结合起来?例如,我是一位用户,正在寻找半径20英里以内的人,但还想找到比他们小2岁或更老的人。
答案 0 :(得分:2)
Firestore数据库可以对多个字段进行过滤,但只能对其中一个字段进行范围过滤。因此此查询是可能的:
collection.where("age", ">", 18).where("age", "<", 20)
但这是不可能的:
// !!!THIS WON'T WORK!!!
collection.where("latitude", ">", 18.001).where("longitude", "<", 21.312)
我所知道的GeoFirestore库都使用geohash(在原始GeoFire库中使用)来完成在基础数据库上似乎不可能的工作:根据纬度过滤地理范围内的文档和经度。
Geohashes通过将位置的纬度和经度组合到单个字符串值中来发挥其魔力,该字符串值可以以不同的精度进行过滤。这是可能的,因为您可以(某种程度上)表达一个经度与纬度之间的关系。因此,您可以将lat和lon的数字压缩合并为一个值,该值具有每个数字的最高有效位。
现在,这也解释了为什么您不能简单地向地理查询添加另一个范围过滤器。您必须找到一种方法来表达年龄差异。如果可以做到,那么将多余的信息编码到geo-age-hash中就可以了。对我来说,这听起来很复杂,但这至少是可能的。
第一个问题是,虽然没有通用的方式将其他属性与纬度和经度相关联,这就是为什么您要独自解决这个问题的原因。我的直觉是,大多数开发人员都放弃了这一要求,或者进行了额外的排序/过滤客户端。
如果您想向geohash添加一个相等过滤器(例如,某个地理范围内的人的文档正好为18),那么在Firestore级别上绝对可以实现,尽管我不知道GeoFirestore库是否公开底层的查询功能可以做到这一点。
我强烈建议您学习更多有关该主题的知识,因为它非常有趣。一些来源:
我还建议您查看有关该主题的先前问题:
其中许多是关于(原始)Firebase实时数据库的GeoFire的,但是相同的原理也适用于Firestore。