使用 Geofire + Firebase 过滤结果

Filtering results with Geofire + Firebase

我正在尝试弄清楚如何使用 Geofire 的过滤器进行查询。 假设我有不同类别的餐厅。我想将该类别添加到我的查询中。我该怎么做?

我现在的一种方法是使用 Geofire 查询键,运行 for 循环遍历每个键并获取餐厅,然后将适当的餐厅插入数组。 这些看起来效率很低。还有其他方法可以解决这个问题吗?

理想情况下,我会得到过滤后的结果,并且只在每个项目即将显示时加载它们。

干杯!

Firebase 查询只能按一种条件进行过滤。 Geofire 已经做了很多 "magic" to allow it to filter on both longitude and latitude. Adding another property to that equation might be possible, but is well beyond what Geofire handles by default. See

如果您一次只想访问一个类别,您可以将餐厅放在每个类别的顶级节点中,然后将 Geofire 指向一个类别。

/category1
    item1
        g: "pns0h0mf2u"
        l: [-53.435719, 140.808716]
    item2
        g: "u417k3dwub"
        l: [56.83069, 1.94822]
/category2
    item3
        g: "8m3rz3s480"
        l: [30.902225, -166.66809]
/items
    item1: ...
    item2: ...
    item3: ...

在上面的示例中,我们有两个类别:category1 有 2 个项目,category2 有 1 个项目。对于每个项目,我们都会看到 Geofire 使用的数据:geohash 以及经度和纬度。我们还保留了一个列表,其中包含这 3 项的其他属性。

但更常见的是,您只需在客户端代码中进行额外的过滤。如果您担心它的性能:测量它,分享代码、JSON 数据和测量。

这是一个老问题,但我在网上的几个地方看到过,所以我想我可以分享一个我用过的技巧。

问题

如果您的数据库中有大量集合,例如可能包含数十万个键,则可能无法全部获取它们。如果您尝试根据位置以及其他条件来过滤结果,您会遇到类似以下问题:

  1. 执行位置查询
  2. 遍历每个返回的geofire key并抓取数据库中的相应数据
  3. 检查每条返回的数据,看它是否符合其他条件

不幸的是,网络请求很多,速度很慢。

更具体地说,假设我们想要获得所有用户,例如特定位置 100 英里范围内的男性,年龄在 20 到 25 岁之间。如果 100 英里范围内有 10,000 个用户,则意味着有 10,000 个网络请求来获取用户数据并比较他们的性别和年龄。

解决方法:

您可以将比较所需的数据存储在 geofire 密钥本身中,以分隔符分隔。然后,您只需拆分 geofire 查询返回的键即可访问数据。您仍然需要过滤它们,但这比发送数百或数千个请求要快得多。

例如,您可以使用以下格式:

UserID*gender*age,可能类似于 facebook:1234567*male*24。重点是

  1. 用分隔符分隔数据点
  2. 使用有效字符作为分隔符 -- "It can include any unicode characters except for . $ # [ ] / and ASCII control characters 0-31 and 127.)"
  3. 使用不会在您的数据库中的其他地方找到的字符 - 我使用了 *,但这可能不适合您。不要使用 -0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz 中的任何字符,因为对于由 firebase 的 push()
  4. 生成的密钥,这些字符是公平游戏
  5. 为数据选择一致的顺序 - 在本例中,首先是 UserID,然后是性别,然后是年龄。

您最多可以在 firebase 密钥中存储 768 bytes of data,这有很长的路要走。

希望对您有所帮助!