有什么方法可以将GeoFireStore查询与普通的Firestore查询结合在一起?

时间:2019-06-13 02:00:13

标签: swift google-cloud-firestore geofire geofirestore

我想查询存储在名为“用户”的集合中的用户。每个用户都有年龄和体重等字段。有没有一种方法可以按与使用GeoFire运行搜索的用户之间的距离来查询用户,并将其与FireStore搜索查询结合起来?例如,我是一位用户,正在寻找半径20英里以内的人,但还想找到比他们小2岁或更老的人。

1 个答案:

答案 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。

相关问题