我在Firebase中有一个对象结构,如下所示:
-KBP27k4iOTT2m873xSE
categories
Geography: true
Oceania: true
correctanswer: "Yaren (de facto)"
languages: "English"
question: "Nauru"
questiontype: "Text"
wronganswer1: "Majuro"
wronganswer2: "Mata-Utu"
wronganswer3: "Suva"
我正在尝试按类别查找对象,例如我希望将所有类别设置为“大洋洲”的对象。
我正在使用Swift,我似乎无法掌握如何查询数据的概念。
我的查询现在看起来像这样:
ref.queryEqualToValue("", childKey: "categories").queryOrderedByChild("Oceania")
ref
是指在该特定路径中对Firebase的引用。
然而,无论我尝试过什么,我都会继续获取所有数据而不是仅返回大洋洲类别的对象。
我的数据结构如下:baseurl/questions/
正如您在对象示例中所看到的,一个问题可以添加多个类别,因此根据我的理解,最好引用对象内的类别。
我可以将我的结构更改为baseurl/questions/oceania/uniqueids/
,但之后我会获得多个条目来覆盖相同的数据,但会有不同的uniqueid
,因为问题会出现在两个类别{{1}下}和oceania
。
通过使用结构geography
和baseurl/questions/oceania/
,我还可以在baseurl/questions/geography
和unique ids
下添加指向特定oceania
的{{1}}在geography
内部,但这意味着我必须跟踪很多引用。可以说关系表。
我想知道这是不是要走了?我应该重组我的数据吗?该应用程序尚未投入生产,因此可以完全重构数据,除了我必须重写代码之外,没有更大的后果,将数据推送到Firebase。
请告诉我,如果所有这些都没有意义并且对文本墙感到抱歉: - )
答案 0 :(得分:4)
在Tim的答案中添加一些额外的代码以供将来参考。
只需使用深层查询。父对象键不是查询的内容,因此它被忽略了#39;。它是否是由autoId或恐龙名称生成的密钥并不重要 - 查询在子对象上,而父(key)在snapshot.key中返回。
根据您的Firebase结构,这将检索大洋洲为真的每个子节点,一次一个:
let questionsRef = Firebase(url:"https://baseurl/questions")
questionsRef.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)
.observeEventType(.ChildAdded, withBlock: { snapshot in
print(snapshot)
})
编辑:出现了关于一次加载所有值(.value)而不是一次加载一个值的问题(.childAdded)
let questionsRef = Firebase(url:"https://baseurl/questions")
questionsRef.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)
.observeSingleEventOfType(.Value, withBlock: { snapshot in
print(snapshot)
})
结果(我的Firebase结构有点不同,但你明白了)uid_1没有Oceania = true所以它从查询中省略了 结果
Snap (users) {
"uid_0" = {
categories = {
Oceania = 1;
};
email = "dude@thing.com";
"first_name" = Bill;
};
"uid_2" = {
categories = {
Oceania = 1;
};
"first_name" = Peter;
};
}
答案 1 :(得分:3)
我认为这应该有效:
ref.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)