3

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

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

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

干杯!

4

2 回答 2

9

Firebase 查询只能按一个条件过滤。Geofire 已经做了一些“魔法”,让它能够过滤经度和纬度。向该等式添加另一个属性可能是可能的,但远远超出了 Geofire 默认处理的范围。请参阅GeoFire:如何在查询中添加额外条件?

如果您一次只想访问一个类别,您可以将餐厅放在每个类别的顶级节点中,并将 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 数据和测量。

于 2015-12-19T04:42:58.953 回答
5

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

问题

例如,如果您的数据库中有一个大型集合,可能包含数十万个键,那么将它们全部获取可能是不可行的。如果除了其他条件之外,您还尝试根据位置过滤结果,那么您会遇到以下问题:

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

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

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

解决方法:

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

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

UserID*gender*age, 这可能看起来像facebook:1234567*male*24. 重点是

  1. 用分隔符分隔数据点
  2. 使用有效字符作为分隔符——“它可以包含除 .$ # [ ] / 和 ASCII 控制字符 0-31 和 127 之外的任何 unicode 字符。)”
  3. 使用不会在您的数据库中其他地方找到的字符 - 我使用 *,但这可能不适合您。不要使用 中的任何字符-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz,因为这些字符对于由 firebase 生成的键是公平的push()
  4. 为数据选择一致的顺序 - 在这种情况下,首先是 UserID,然后是性别,然后是年龄。

您可以在 Firebase 密钥中存储多达768 字节的数据,这有很长的路要走。

希望这可以帮助!

于 2016-08-23T19:08:13.623 回答