2017-02-14 5 views
0

それぞれの要素が2つの条件を満たすFirebaseデータベースから値のリストを返すことができるのだろうかと思います。例えば条件が2つあるFirebaseデータベースを照会

、私のデータベースは、このように見えた場合:

MYAPP 
|_______________items 
|     |_____OshwYF72Jhd9bUw56W7d 
|     |     | 
|     |     |__item_name:"plank_5" 
|     |     |__length:"120"    
|     |     |__width:"50"    
|     |        
|     |_____KbHy4293dYgVtT9pdoW 
|     |_____PS8tgw53SnO892Jhweh 
|     |_____Gicuwy8r23ndoijdakr 
| 
|___customers 

そして私は100から150の間との間の幅の長さを持っているすべての項目のitem_nameのためのデータベースを照会したいです30- 70、Firebaseのクエリでこれを行う方法はありますか?

私はここで答えを読んだ:Query based on multiple where clauses in firebaseしかし、それは複数のbetween/range節を扱っていない。これは私が上記のシナリオで必要とするものである。

私はこのプラグインを別の答えで見ました:https://github.com/davideast/Querybaseしかし、where節は値の範囲を取っていないようです。例:

const queriedDbRef = querybaseRef 
    .where({ 
    length: (between 100-150), 
    width: (between 30-70) 
    }); 

このようなクエリも可能ですか?または、1つの条件に一致するすべての項目を取得してから、Javascriptを使用してクライアント側に2番目の条件を適用する必要がありますか?

答えて

3

Firebaseデータベースクエリは、1つのプロパティに対してのみ順序付け/フィルタリングできます。それは近い将来変更される可能性のない厳しい制限です。

いくつかのケースでは、複数の値を1つのプロパティ(たとえば、リンクした回答またはQueryBase)に組み合わせることができます。しかし、あなたが見つけたそれらのケースでは、それらの値のうちの1つ、すなわち最後のものに対してのみ相対/範囲クエリを実行することができます。

私の知る限り、誰かが多値範囲のクエリを実装している唯一のケースは、場所の経度と緯度を組み合わせたGeoFireです。GeoHashです。私は、ジワハシについてもっと読むことを強くお勧めします。なぜなら、彼らは非常にユニークなことをしているからです:2つの数値を1つの文字列の値に結合して、

結合する2つの値(長さと幅)を見ると、かもしれません。と同様の複合文字列を作成することは可能です。しかし、ユースケースの2つの値を組み合わせる方法を見つける必要があります。最も単純なエリア格納するだろう場合、私は考えることができる方法なので、長さ*幅:

{ 
    items: { 
    "OshwYF72Jhd9bUw56W7d": { 
     item_name:"plank_5", 
     length: 120, // you store length and width as strings, please fix that 
     width: 50, 
     area: 6000 
    } 
    } 
} 

あなたは3000(100x30)と10500(70x150)との間の領域でアイテムをフィルタリングすることができますこの方法:

var query = ref.orderBy("area").startAt(3000).endAt(10500); 

あなたは(Geofireがところで同じことを)不一致を拒否するようにいくつかの余分なフィルタリングクライアント側を実行する必要がありますので、このクエリは、あまりにも多くのアイテムが一致します。

query.on("child_added", function(snapshot) { 
    var item = snapshot.val(); 
    if (item.length >= 100 && item.length <= 150 
     && item.width >= 30 && item.width <= 70) { 
    // TODO: do something with the item 
    } 
}); 
+0

これは本当に面白い@フランク - バン - パフュレンです!あなたの詳細な答えをありがとう。私はあなたのアドバイスを取ってきて、最後の日にgeoFireを学ぼうとしていましたが、geoFireクエリーからIDを返すことに少し問題がありました。あなたがここでそれを見ることができるかどうか疑問に思っていました。http: //stackoverflow.com/questions/42275999/firebase-geofire-how-to-return-an-array-of-ids-within-a-rangeこれもありがとう! – Emily

+0

ほとんどの場合、Geofireは、箱の外で思っていて、努力するのに喜んでいると思われる場合、一見不可能なことがどのように可能であるかの例として使用されています。 1つは、並べ替えが可能なように、1つの文字列で経度と緯度を組み合わせることは決して考えられませんでした。幸いなことに、length * widthはやや計算が簡単でした。 :-) –

関連する問題