2013-06-26 30 views
5

由於firebase不支持任何空間索引,因此我使用geohash這裏有人建議。 Geohash正在使用字符來查找附近。如何查詢與匹配字符串前綴的鍵相關的Firebase

所以我們說,我有火力w22qt4vhye1cw99qt4vdf4vcw22qt4vhzerct地理散列存儲和我只取地理散列接近w22qt4查詢。

如何做到這一點?

我知道firebase有startAt。我試過但沒有工作。

UPDATE

存儲地理散列以火力

//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 
    - 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中做些什麼,以便我可以在上面獲得預期結果?

+0

你能提供你正在嘗試的代碼片段,所以我可以提供更有意義的反饋嗎? –

+0

@AndrewLee嗨,我剛剛更新了我的問題,請看看。 – vzhen

+0

您可以使用「endAt」以特定鍵結束。請參閱下面我的帖子的編輯。 –

回答

5

除了安德魯的回答上面,你想要做的就是與geohashes預期的效果是什麼(即能夠做到,讓你在「查詢」指定的精度,特別是前綴查詢,例如,geohash中的每3個字符就會得到〜+ -80km)就是以更細粒度和離散化的方式存儲數據。

因此,不是現在如何存儲它,而是通過將geohash字符串鍵切成片段來保存數據(我已經在3個字符邊界處完成了這個操作,但是您應該選擇合適的標記化戰略,讓您所需的精度),並使用每個片段作爲一個孩子的名字,因爲這樣的:

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

然後,在你的問題,當你需要得到與w22qt4開始,你會做所有geohashes查詢:

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

然後,你會得到vhyvhz孩子,然後有你感興趣的所有實際geohashes。

+0

如何查詢sub子子目錄下的val?我閱讀firebase文檔。我發現'hasChildren()'和'forEach()'。這是正確的事情使用?順便說一下,我可以在angularFire中使用嗎?因爲我使用的是與angularjs的firebase。 – vzhen

+0

由於數據已按規定方式非規範化,因此您無需應用Firebase查詢。您可以將偵聽器附加到樹中的適當級別,它將返回所返回快照中的所有子子項。 – Vikrum

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'); 
+0

這沒有得到我想要的,我再次更新我的問題。我覺得這次更清楚了。請檢查一下。謝謝 – vzhen

+0

對不起,我忘了提及我不知道結局是什麼。 我加了一個小提琴。請看看 http://plnkr.co/edit/Wtkq4978r1a4dnSLl9qi?p=preview – vzhen

+0

我們沒有辦法只用前綴查詢。您需要確定查詢應該結束的位置。我們以書面形式命令事情,所以如果你想要c *,那麼你可以開始c和結束d,然後扔掉任何完全匹配的d。 –