使用Geofire + Firebase过滤结果

时间:2015-12-18 02:18:21

标签: firebase firebase-hosting geofire

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

我现在的一种方法是使用Geofire查询密钥,通过每个密钥运行for循环并进入餐厅,并将相应的餐厅插入阵列。 这些似乎效率低下。还有其他方法可以解决这个问题吗?

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

干杯!

2 个答案:

答案 0 :(得分:8)

Firebase查询只能按一个条件进行过滤。 Geofire已经做了很多"magic"以允许它在经度和纬度上进行过滤。可能会在该等式中添加另一个属性,但远远超出Geofire默认处理的属性。见GeoFire: How to add extra conditions within the query?

如果您一次只想访问一个类别,则可以将餐馆放在每个类别的顶级节点中,并将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 :(得分:3)

这是一个老问题,但我已经在网上的一些地方看过它,所以我想我可能会分享一个我曾经使用过的技巧。

问题

例如,如果数据库中有大量集合,可能包含数十万个密钥,则可能无法全部获取它们。如果您尝试根据位置过滤结果以及其他标准,那么您就会遇到以下问题:

  1. 执行位置查询
  2. 遍历每个返回的地理位置密钥并获取数据库中的相应数据
  3. 检查每个返回的数据以查看它是否与其他条件匹配
  4. 不幸的是,这是很多网络请求,这很慢。

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

    解决方法:

    您可以将比较所需的数据存储在地理位置键本身中,并以分隔符分隔。然后,您可以拆分地理围栏查询返回的密钥以访问数据。您仍然必须对它们进行过滤,但它比发送数百或数千个请求要快得多。

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

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

    1. 用分隔符分隔数据点
    2. 使用有效字符作为分隔符 - "它可以包含除。之外的任何unicode字符。 $#[] /和ASCII控制字符0-31和127。)"
    3. 使用数据库中其他地方找不到的字符 - 我用*,但这可能不适合你。不要使用-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz中的任何字符,因为这些字符对于firebase push()
    4. 生成的密钥是公平的游戏
    5. 为数据选择一致的顺序 - 在这种情况下,首先是UserID,然后是性别,然后是年龄。
    6. 您可以在firebase密钥中存储最多768 bytes of data,这有很长的路要走。

      希望这有帮助!