由孩子的孩子在Firebase中查询

时间:2016-05-08 21:21:41

标签: swift firebase

我在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

通过使用结构geographybaseurl/questions/oceania/,我还可以在baseurl/questions/geographyunique ids下添加指向特定oceania的{​​{1}}在geography内部,但这意味着我必须跟踪很多引用。可以说关系表。

我想知道这是不是要走了?我应该重组我的数据吗?该应用程序尚未投入生产,因此可以完全重构数据,除了我必须重写代码之外,没有更大的后果,将数据推送到Firebase。

请告诉我,如果所有这些都没有意义并且对文本墙感到抱歉: - )

2 个答案:

答案 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)