使用Geofire + Firebase过滤结果

ord*_*n09 3 firebase geofire firebase-hosting

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

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

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

干杯!

Fra*_*len 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: ...
Run Code Online (Sandbox Code Playgroud)

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

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


Zen*_*lon 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. 为数据选择一致的顺序 - 在本例中,首先是用户 ID,然后是性别,然后是年龄。

您最多可以在 firebase 键中存储768 字节的数据,这很重要。

希望这可以帮助!