2016-08-28 68 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