【问题标题】:Is there a way I can combine a GeoFireStore query with a normal Firestore query?有没有办法可以将 GeoFireStore 查询与普通 Firestore 查询结合起来?
【发布时间】:2019-10-27 13:43:31
【问题描述】:

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

【问题讨论】:

  • google "geofire firestore query" 上有很多内容我已经实现了一种非常基本的方法,它使用 geohashes 来存储每个用户的位置。然后使用非常简单的 firestore 查询来获得与用户一定距离内的结果

标签: swift google-cloud-firestore geofire geofirestore


【解决方案1】:

Firestore 数据库可以过滤多个字段,但它只能对其中一个字段进行范围过滤。所以这个查询是可能的:

collection.where("age", ">", 18).where("age", "<", 20)

但这是不可能的:

// !!!THIS WON'T WORK!!!
collection.where("latitude", ">", 18.001).where("longitude", "<", 21.312)

我所知道的 GeoFirestore 库都使用 geohashes(在原始 GeoFire 库中使用)能够在底层数据库上做一些看似不可能的事情:根据纬度过滤地理范围内的文档 经度。

Geohashes 通过将位置的纬度和经度组合成单个字符串值来发挥其魔力,可以以不同程度的准确度对其进行过滤。这是可能的,因为您可以(某种程度上)表达一个经度与一个纬度的关系。因此,您可以将 lat 和 lon 的数字压缩合并为一个值,该值具有每个第一位的最高有效数字。

现在这也解释了为什么您不能简单地向地理查询添加另一个范围过滤器。你必须找到一种用距离来表达年龄差异的方法。如果你能做到这一点,那就“只是”将额外信息编码到地理年龄哈希中的问题。这对我来说听起来很复杂,但至少是可能的。

第一个问题是虽然没有通用的方法将附加属性与纬度和经度相关联,这就是为什么您将自己解决这个问题的原因。我的直觉是大多数开发人员放弃了这个要求,或者在客户端进行了额外的排序/过滤。

如果您想向 geohash 添加相等过滤器(例如,特定地理范围内正好 18 岁的人的文档),这在 Firestore 级别上绝对是可能的,尽管我不知道 GeoFirestore 库是否公开执行此操作的底层查询功能。

我强烈建议您进一步了解该主题,因为它非常吸引人。一些来源:

我还建议您查看有关该主题的这些先前问题:

其中许多是关于(原始)Firebase 实时数据库的 GeoFire,但同样的原则也适用于 Firestore。

【讨论】:

  • 为了能够将查询与其他运算符结合起来,github.com/mbramwell1/GeoFire-Android 提供的库将数字(双格式)与位置坐标相关联。这种方法的缺点是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2015-04-05
  • 2018-11-08
相关资源
最近更新 更多