【问题标题】:Querying in Firebase by child of child通过孩子的孩子在 Firebase 中查询
【发布时间】:2016-05-08 21:21:41
【问题描述】:

我在 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 不同,因为问题将出现在oceaniageography 两个类别下。

通过使用baseurl/questions/oceania/baseurl/questions/geography 结构,我还可以在oceaniageography 下添加unique ids,它指向baseurl/questions/uniqueids 内的特定unique id,但这意味着我' d 必须跟踪很多参考资料。可以说是制作关系表。

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

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

【问题讨论】:

标签: swift firebase


【解决方案1】:

在 Tim 的答案中添加一些额外的代码以供将来参考。

只需使用深度查询。父对象键不是被查询的,所以它被“忽略”。无论是由 autoId 生成的键还是恐龙名称都没有关系 - 查询是针对子对象的,而父对象(键)在 snapshot.key 中返回。

根据您的 Firebase 结构,这将检索 Oceania 为 true 的每个子节点,一次一个:

      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;
    };
}

【讨论】:

    【解决方案2】:

    我认为这应该可行:

    ref.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)
    

    【讨论】:

    • 恐怕这也无济于事。我猜问题是对象的键,这是将对象插入 Firebase 时生成的唯一 ID。我还用我认为可行但行不通的查询更新了我的问题。
    • @Darwind Tim 的回答很准确并且有效,因此应该被接受。我也在答案中添加了一些额外的代码。但是这个是正确的。
    • @Jay 显然是这样,但我使用的是ref.observeSingleEventOfType(.Value...,它总是返回所有元素。我想我还有很长的路要走——你的加入帮助解决了这个难题:-)
    • @Darwind 所以.ChildAdded 只给你你想要的值,而.Value 给你一切?
    • @TimVermeulen 是的 - 我还没有得到,但我想我对 Firebase 的了解仍然非常有限......
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2019-08-27
    相关资源
    最近更新 更多