我试图弄清楚如何使用Geofire查询过滤器。 假设我有不同类别的餐馆。我想将该类别添加到我的查询中。我该怎么做?
我现在的一种方法是使用Geofire查询密钥,通过每个密钥运行for循环并进入餐厅,并将相应的餐厅插入阵列。 这些似乎效率低下。还有其他方法可以解决这个问题吗?
理想情况下,我会获得过滤后的结果,并且只会在每个项目即将显示时加载。
干杯!
答案 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)
这是一个老问题,但我已经在网上的一些地方看过它,所以我想我可能会分享一个我曾经使用过的技巧。
问题
例如,如果数据库中有大量集合,可能包含数十万个密钥,则可能无法全部获取它们。如果您尝试根据位置过滤结果以及其他标准,那么您就会遇到以下问题:
不幸的是,这是很多网络请求,这很慢。
更具体地说,我们想要让所有用户都能在100英里的特定位置是男性,年龄在20到25岁之间。如果100英里内有10,000名用户,这意味着10,000个网络请求获取用户数据并比较他们的性别和年龄。
解决方法:
您可以将比较所需的数据存储在地理位置键本身中,并以分隔符分隔。然后,您可以拆分地理围栏查询返回的密钥以访问数据。您仍然必须对它们进行过滤,但它比发送数百或数千个请求要快得多。
例如,您可以使用以下格式:
UserID*gender*age
,可能看起来像facebook:1234567*male*24
。重点是
-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
中的任何字符,因为这些字符对于firebase push()
您可以在firebase密钥中存储最多768 bytes of data,这有很长的路要走。
希望这有帮助!