如何查询Firebase以查找与字符串前缀匹配的键

时间:2013-06-26 19:41:00

标签: firebase

由于firebase不支持任何空间索引,所以我使用geohash,有人在这里建议。 Geohash正在使用角色来寻找附近的人物。

因此,我想在firebase中使用w22qt4vhye1c w99qt4vdf4vc w22qt4vhzerct geohash存储,我只想查询接近w22qt4的哪个geohash。

怎么做?

我知道firebase有startAt。我试过但不行。

更新

将geohash存储到firebase

//Encode lat lng, result w22qt4vhye1c3
var geoHashLatLng = encodeGeoHash(lat,lng);
firebaseRef.child('/geohash/' + geoHashLatLng).set(id); 

所以在json

  root
   - geohash
      - w22qt4vhye1c3
         - id
      - z99qt4vdf4vc
      - w22qt4vhzerct

我的问题在这里。 我只想查询从字符w22qt4开始的geohash。我们可以在firebase中这样做吗?

更新2 startAt()似乎不是以字符开头的查询...

示例:我有以下gehash

geohash节点

geohash
  - a123
  - a333
  - b123
  - c123
  - d123

使用以下代码

var firebaseRef = new Firebase('https://test.firebaseio.com');
var query = firebaseRef.child('/geohash').startAt(null, 'a');
query.on('child_added', function(snapshot) {
    console.log(snapshot.name());
});

会得到这个结果

startAt(null, 'a') //return a123, a333, b123, c123, d123
startAt(null, 'c123') //return c123, d123
startAt(null, 'd') //return d123

我的预期结果

startAt(null, 'a') //return a123, a333
startAt(null, 'c123') //return c123
startAt(null, 'd') //return d123

我的猜测,startAt()将按顺序查询26个字母但不匹配。 那么,我可以在firebase中做些什么,这样我才能得到上面的预期结果?

2 个答案:

答案 0 :(得分:7)

除了安德鲁上面的答案之外,你想做些什么来获得地理位置的预期效果(即能够做前缀查询,让你在'查询'中指定准确性,特别是,例如,每3个字符geohash让你〜+ -80km)以更细化和离散的方式存储数据。

所以,不是你现在如何存储它,你需要通过将geohash字符串键切割成片段来保存数据(我已经在3个字符边界处完成了,但你应该选择一个合适的标记化提供所需精确度的策略)并将每个片段用作子名称,如下所示:

root
  - geohash
      - w22
        - qt4
          - vhy
            - e1c
              - w22qt4vhye1c3
                - id
          - vhz
            - erc
              - w22qt4vhzerct
                - id
      - z99
          - qt4
            - vdf
              - z99qt4vdf4vc
                - id

然后,如您的问题所示,当您需要获取以w22qt4开头的所有地理位置时,您将对以下内容进行查询:

firebaseRef.child('/geohash/w22/qt4/')

然后会为您提供vhyvhz个孩子,然后这些孩子会拥有您感兴趣的所有实际地理位置。

答案 1 :(得分:2)

您可以使用普通的startAt查询来查找指定键附近的键。例如,在这种情况下你会:

var query = firebaseRef.child("geohash").startAt(null, 'c').limit(5);
query.on("child_added", ...);

这将在lexigraphically排序后为geoHashLatLng提供5个元素。

如果要在某个指定的键上结束查询,也可以这样做。例如:

var query = firebaseRef.child("geohash").startAt(null, 'c').endAt('d');