Firebase检索子嵌套数据

时间:2020-05-20 19:40:26

标签: ios swift firebase-realtime-database

我要使用此值7hmpcTuCAYQAYRqP7RNmnegSd9r2

检索数据

但是我正在快照中获取所有四个对象。我想获取包含此密钥的父密钥值 7hmpcTuCAYQAYRqP7RNmnegSd9r2 需要获得蓝色标记键。

这是我的代码

     let ref = FirebaseManager.refs.databaseRoot.child("new_ChatListMembers")
    ref.queryOrdered(byChild: (Auth.auth().currentUser?.uid)!).queryEqual(toValue: true)
    ref.observeSingleEvent(of: .value) { (snapshot) in
        print(snapshot)
    }

此代码返回四个对象,而不是两个。请帮助我如何获取特定数据。 谢谢

enter image description here

1 个答案:

答案 0 :(得分:1)

您实际上并没有使用在代码中构造的查询。要使用它,它将类似于:

let ref = FirebaseManager.refs.databaseRoot.child("new_ChatListMembers")
let query = ref.queryOrdered(byChild: (Auth.auth().currentUser?.uid)!).queryEqual(toValue: true)
query.observeSingleEvent(of: .value) { (snapshot) in
    print(snapshot)
}

但这实际上并不能很好地扩展,因为您需要为该结构中的每个UID值定义一个索引。简而言之:您当前的数据结构使每个人都可以找到特定聊天室的用户,但这无助于查找特定用户的聊天室。

要允许后者,您需要在数据中添加一个额外的结构:

user_chats: {
  "$uid": {
    "$chatid": true
  }
}

因此,这几乎与您已拥有的东西成反比,这就是为什么它通常被称为反指数的原因。

有关此示例和另一个示例的更多信息,请在这里查看我的答案:Firebase query if child of child contains a value