2013-06-26 15 views
5

firebaseは空間インデックスをサポートしていないので、私はここで誰かが助言するgeohashを使用します。 Geohashは文字を使用して近くを検索しています。文字列プレフィックスに一致するキーをFirebaseに照会する方法

だから私はfirebaseでw22qt4vhye1cw99qt4vdf4vcw22qt4vhzerctジオハッシュストアを持っていると私はw22qt4に近いジオハッシュただけで照会するとしましょう。

どうすればよいですか?

私はfirebaseにstartAtがあることを知っています。私は試しましたが、仕事はしません。

root 
    - geohash 
     - w22qt4vhye1c3 
     - id 
     - z99qt4vdf4vc 
     - w22qt4vhzerct 

JSONにので、ここで私の質問を

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

をfirebaseするジオハッシュを保存

UPDATE

。 私はちょうど文字から始まるgeohashを質問したいですw22qt4。私たちは火の基盤でそれを行うことができますか?

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

が、これは26個のアルファベット順ではなく一致しないを照会します

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を()の結果を得るだろう。 それで、私はfirebaseで何ができますか?私は上記の結果を得ることができますか?

+0

私はより意味のあるフィードバックを提供できるように、あなたがしようとしているコードスニペットを提供できますか? –

+0

@AndrewLeeこんにちは、私はちょうど私の質問を更新しました。 – vzhen

+0

"endAt"を使用して特定のキーで終了することができます。下記の私の記事の編集を参照してください。 –

答えて

5

、(すなわち、具体的には、あなたが「QUERY」の精度を指定できプレフィックスクエリを行うことができますたとえば、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/') 

あなたが興味を持っているすべての実際のgeohashesを持っているvhyvhzの子供を与えます。

+0

サブチャイルドの下のvalをどこに問い合わせるのですか?私はfirebaseのドキュメントに読んだ。 'hasChildren()'と 'forEach()'が見つかりました。それは正しいものですか?ところで、私はangularFireで使うことができますか?なぜなら、私はangularbaseを持つfirebaseを使っているからです。 – vzhen

+0

データは所定の方法で非正規化されているため、Firebaseクエリを適用する必要はありません。ツリーの適切なレベルにリスナーをアタッチすると、返されるスナップショット内のすべてのサブアドレスが返されます。 – Vikrum

2

通常のstartAtクエリを使用して、指定されたキーに近いキーを見つけることができます。たとえば、この場合、次のようになります。

これは、lexigraphicallyソートされたgeoHashLatLngの後ろに5つの要素を与えます。

指定したキーでクエリを終了したい場合は、同様に行うことができます。たとえば:あなたはgeohashesと所望の効果を得るために何をしたいのか上記のアンドリューの答えに加えて

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

これは私が欲しいものを得られない、私は再び私の質問を更新しました。私は今回はもっとはっきりと思う。チェックアウトしてください。ありがとう – vzhen

+0

申し訳ありませんが、私はエンディングが何であるかわからないことを言い忘れました。 私はフィドルを追加しました。どうぞご覧ください http://plnkr.co/edit/Wtkq4978r1a4dnSLl9qi?p=preview – vzhen

+0

私たちは単にプレフィックスで質問する方法はありません。クエリを終了する場所を特定する必要があります。私たちは物事を語彙的に注文します。だからc *を望むならば、あなたはcとendAt dを開始し、そのまったく正確にdを捨てることができます。 –

関連する問題