子对象的Swift Firebase查询子对象

子对象的Swift Firebase查询子对象,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,所以我在这里被困了半天,我正在尝试获取雅利娅的所有主题,但我很难做到这一点 这是Firebase中的示例结构 -Subjects -math id: 1 name: Math -students -Arya id: 1 name: Arya -JonSnow id: 2

所以我在这里被困了半天,我正在尝试获取雅利娅的所有主题,但我很难做到这一点

这是Firebase中的示例结构

-Subjects
    -math
        id: 1
        name: Math
        -students
            -Arya
                id: 1
                name: Arya
            -JonSnow
                id: 2
                name: JonSnow
            +justsomename
    +science
    +english
    +history
    +computer
然后我找到了这个

我试过这个

ref.queryOrdered(byChild: "students/name").queryEqual(toValue: "Arya").observeSingleEvent(of: .value, with: { snapshot in

        print(snapshot)
    })
ref==受试者

但这是回报

Snap (subjects) <null>
Snap(主题)
这个问题正确吗?我只是做错了什么


也许是这样的。。。。可以工作

var subjects = [String]()

    ref.observeSingleEvent(of: .value, with: { snapshot in

        let value = snapshot.value as? NSDictionary
        let postsIds = value?.allKeys as! [String] // this will put all the subjects such as math into an array called postIDs

        for postId in postsIds { //this is going to cycle through the array and check each one for your student
            let refToPost = Database.database().reference(withPath: "Subjects" + postId)
            refToPost.observeSingleEvent(of: .value, with: { snapshot in
                if snapshot.hasChild("Arya") {



                    self.subjects.append(snapshot)
                }
            })
        }
    })
  print("this is the ist of subjects with my student: \(subjects)")

你想得到什么价值?我想得到一个叫Arya的学生的所有科目。@Mappeal你有没有试着把学生/姓名分开?我不知道这是否能解决问题,但我会尝试一下:
child(“学生”).queryOrdered(byChild:“name”).queryEqual(toValue:“Arya)”
。关于
ref
,它指的是
科目/-数学
?我认为这是因为你在寻找与学生平等的科目的子科目,但找不到子科目学生,因为这是另一个科目(如数学)的子科目。您需要让它检查每个主题子项(即数学)以获得查询。Firebase数据库查询可以通过已知路径的属性进行筛选。无法在动态路径中查询您正在尝试执行的属性。这意味着您需要修改数据模型,以允许进行所需的查询,例如,存储“每个学生的班级”的顶级列表。也可以看出这是可行的,但不是最佳实践。为什么?因为你在这里要做的是从节点读取所有结果,然后在手机上过滤掉它们。请记住,由于您阅读了所有数据,因此您可能会阅读几千个结果。您应该改为使用
queryOrdered
,并在执行查询时过滤结果。这样,您将在响应中只得到很少的结果,而不是该节点内的所有结果。如果我们将
refToPost.observeSingleEvent(of:.value,with:{snapshot in
更改为
refToPost.queryOrdered(by child:“students/name”).queryEqual(toValue:“Arya”).observeSingleEvent(of:.value,with:{snapshot in
这是OP已经拥有的。但是的,这是正确的方法。我已经这样做了,但我担心这个解决方案,所以我正在寻找更好的方法。无论如何,谢谢。