2013-06-26 14 views
5

Firebase herhangi bir uzamsal indekslemeyi desteklemediğinden, bu konuda tavsiye veren geohash kullanıyorum. Geohash, yakındakileri bulmak için karakterler kullanıyor.Dize önekiyle eşleşen anahtarlar için Firebase nasıl sorgulanır

Yani Firebase içinde w22qt4vhye1cw99qt4vdf4vcw22qt4vhzerct geohash mağaza var ve ben w22qt4 yakın geohash hangi sadece sorgulamak istiyorum diyelim.

Bu nasıl yapılır?

Firebase'in başladığını biliyorum. Denedim ama işe yaramadı.

GÜNCELLEME

saklanması geohash yüzden json burada Sorum

root 
    - geohash 
     - w22qt4vhye1c3 
     - id 
     - z99qt4vdf4vc 
     - w22qt4vhzerct 

yılında

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

Firebase için. Sadece w22qt4 karakterlerinden başlayan geohash sorgulamak istiyorum. Bunu firebase'de yapabilir miyiz?

GÜNCELLEME 2 startAt() karakter

Örnek ... ile başlayan ile sorgulamaz gibi görünüyor: Aşağıdaki kod ile gehash

geohash düğümü

geohash 
    - a123 
    - a333 
    - b123 
    - c123 
    - d123 

aşağıdakilere sahip

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()); 
}); 

bu 26 alfabe harfleri sırayla ancak uymayan sorgular

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

My beklenen sonuçları

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

Benim tahminim, startAt() sonuçları alacak. Peki, beklenen sonuçlara ulaşabilmem için firebase'de neler yapabilirim?

+0

Daha anlamlı bir geri bildirim sağlayabilmek için, çalıştığınız şeyin bir kod snippet'i sunabilir misiniz? –

+0

@AndrewLee Merhaba, Sadece sorumu güncelledim, lütfen bir göz atın. – vzhen

+0

Belirli bir anahtara son vermek için "endAt" öğesini kullanabilirsiniz. Aşağıdaki yazıya yapılan düzenlemelere bakın. –

cevap

5

(yani spesifik olarak, 'sorguda' in doğruluğunu belirtmek izin önek sorguları yapabilmek, Örneğin geohash'daki her 3 karakter ~ + -80km) verileri daha ayrıntılı ve discretize bir şekilde saklamaktır.

Şimdi, onu nasıl depoladığınızdan ziyade, verileri geohash dize anahtarını parçalara bölerek kaydetmek isteyeceksiniz (3 karakter sınırında yaptım, ancak uygun olanı seçmelisiniz gibi dizgeciklere size arzu doğruluk verir stratejisi) ve bir alt isim olarak her parçasını kullanmak,:

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

Ardından, bir yapacağını w22qt4 ile başlayan tüm geohashes almak gerekir sorunuza olduğu gibi karşı sorgu:

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

Daha sonra vhy ve vhz çocuklara daha sonra hangi ilgilendiğiniz gerçek geohashes'lara sahip olacaksınız.

+0

Alt altta yatan verinin nasıl sorgulanır? Firebase belgelerine okudum. 'HasChildren()' ve 'forEach()' ı buldum. Bu doğru şeyler mi? Bu arada, angularFire'da kullanabilir miyim? çünkü angularjs ile firebase kullanıyorum. – vzhen

+0

Veriler verilen şekilde denormalize edildiğinden, Firebase sorgularını uygulamanız gerekmeyecekti. Dinleyicileri ağaçtaki uygun seviyeye bağlayabilir ve geri gönderilen fotoğrafların içindeki tüm alt çocukları geri gönderebilirsiniz. – Vikrum

2

Belirtilen anahtarın yakınındaki anahtarları bulmak için normal bir startAt sorgusu kullanabilirsiniz. Örneğin, bu durumda olur: lexigraphically sıralandığında

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

Bu geoHashLatLng sonra size 5 unsurları verecektir.

Sorgunuzu belirli bir anahtarda sonlandırmak isterseniz, bunu da yapabilirsiniz. Örneğin:

Eğer geohashes ile istenen etkiyi elde etmek için ne yapmak istediğinizi yukarıdaki Andrew cevap, ek olarak
var query = firebaseRef.child("geohash").startAt(null, 'c').endAt('d'); 
+0

Bu istediğimi almıyor, sorumu tekrar güncelledim. Bu sefer daha açık düşünüyorum. Lütfen kontrol et. Teşekkürler – vzhen

+0

Üzgünüm, bahsettiğim şeyi sonlandırmanın ne olduğunu bilmiyorum. Bir keman ekledim. Lütfen bir göz atın http://plnkr.co/edit/Wtkq4978r1a4dnSLl9qi?p=preview – vzhen

+0

Yalnızca önekle sorgulamanın bir yolu yok. Sorgunun nerede bitmesi gerektiğini bulmalısın. Bir şeyleri sözel olarak sipariş ediyoruz, eğer c * 'yi isterseniz, o zaman c ve endAt d'yi başlatabilir ve daha sonra tam olarak eşleşecek olanları atabilirsiniz. –

İlgili konular