2016-08-28 4 views
1

私は私のデータベースに次のようなデータ構造を持っている:queryEqualToを使用してFirebase()2回

enter image description here

私はドのような一つの言語で質問を照会する方法を理解します:

let ref = FIRDatabase.database().reference().child("madeGames") 
    ref.queryOrderedByChild("de").queryEqualToValue(true).observeSingleEventOfType(FIRDataEventType.Value) { (snap: FIRDataSnapshot) in 
     print("Data:", snap.value) 
    } 

問題:

私はちょうどdeとenからゲームを得ることは不可能と思われる彼はサーバー。

私は最初にすべてのde質問をダウンロードしてからループをオフラインでスローすることができますが、それは私のために非常に知的ではないようです。

誰でも効率を上げる方法を知っていますか?

+0

https://groups.google.com/forum/#!topic/firebase-talk/ZDHKwxRMiKQ、この記事に従ってください。また、Firebaseチームが提供する解決策はありませんが、確認してください。 ) – Dravidian

+2

Firebase内の複数の子供に対して、組み込みの機能を持つものは本当に照会することができません。しかし、これにはいくつかの方法があります。 [Querybase](https://github.com/davideast/Querybase) – Jay

+0

@Jayありがとうございますが、Querybaseもオフラインの権利として動作します@DavidEast作成されたライブラリ? –

答えて

2

子のプロパティをこのような単一のプロパティに結合して構造を変更することもできます。

made_games 
    -jjjjsd903 
     language_available: 0 //just de 
    -j090iQ0ss 
     language_available: 3 //de_en 

languages_available 
    0: de 
    1: en 
    2: fr 
    3: de_en 
    4: de_en_fr 

編集を - と私はただの...と思った別のオプションは、バイナリ行く:あなたは言語の多くを持っている場合

made_games 
    -jjjjsd903 
     de_en: true 
     de_fr: true 
    -j090iQ0ss 
     de: true 

あなたもこれを行うことができます!

00000001 = en 
00000010 = fr 
00000100 = de 
00001000 = du 
00010000 = ge 

言語の組み合わせを取得するには、2つ(またはそれ以上)のビット単位で 'または'演算を実行します。

en_deを取得するには00001001です。en_du_geを取得するには00011001が必要です.8言語を使用している場合は、8ビットと256の組み合わせで表現できます。だから、もしあなたが11の言語を持っていれば、それは2^11 = 4096までの組み合わせになります。

この手法を使用すると、en_frなどを完全に保存することなく、ビット単位の値を検索することができます。

バイナリ番号の10進数版をFirebaseに保存することができます。わかりやすくするためにここにバイナリを示しています。

+0

私はそれも考えましたが、もしあなたが50の言語を持っていれば、大量のデータがあります。 –

+0

を保存するために2500の鍵の値のペアがあります。ディスク容量は安く、2500はたくさん保存できません。しかし、物事をきちんと整理するために、各ノードにデータを保存する代わりに、組み合わせを参照することをお勧めします。 – Jay

+0

@ M.Kremer本当にうまくいくかもしれないと思っていたので、答えを更新しました。 – Jay

関連する問題