2016-08-28 106 views
1

我在我的數據庫中的數據結構如下:火力地堡使用queryEqualTo()兩次

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從t他服務器。

當然,我知道我可以先下載所有的問題,然後循環拋棄它們,但這對我來說似乎並不聰明。

有誰知道如何做到這一點更多的效率?

+0

https://groups.google.com/forum/#!topic/firebase-talk/ZDHKwxRMiKQ,請點擊這篇文章,雖然firebase團隊尚未提供任何解決方案,但請繼續檢查...: ) – Dravidian

+2

實際上,您無法在Firebase中爲多個子項查詢(多個查詢位置)以及任何內置功能。但是,有很多方法可以解決這個問題。 @DavidEast創建的庫可能是有趣的[Querybase](https://github.com/davideast/Querybase) – Jay

+0

@Jay謝謝,但是Querybase也可以作爲脫機使用嗎? –

回答

2

一種可能的選擇是通過將兒童屬性組合到一個屬性中來更改結構。

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

如果你有很多的語言,你也可以這樣做:

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 

編輯 - 我只是想的......另一種選擇去二進制!

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

然後,要獲得任何語言組合,請對您想要的兩個(或多個)執行按位或'或'操作。

所以要得到en_de,它是00001001.要獲得en_du_ge,它將是00011001.如果您有8種語言,那麼可以用8位和256種組合表示。所以如果你有11種語言,那將是2^11 =多達4096個組合。

使用這種技術,你可以完全避免存儲en_fr等,只是搜索bitwised值。

您可以在Firebase中存儲二進制數字的十進制版本......爲了清晰起見,在此僅顯示二進制文件。

+0

我也想到了這一點,但如果你有50種語言,你將擁有2500個關鍵值對來存儲 –

+0

磁盤空間很便宜,而且2500不是很大的存儲空間。但是,爲了保持整潔,你可能想保留對組合的引用,而不是將數據保留在每個節點中,我更新了我的答案 – Jay

+0

@ M.Kremer有另一個想法可能工作得很好,所以我更新了答案。 – Jay