我在 firebase 上并不出色,但是我正在开发一个项目,用于升级聊天应用程序。我在其中创建包含成员的组的内部创建了一个非节点 GroupChat 。现在,我想检查子元素节点中的 userid 是否可用,例如 UserInfo / userid 。通过观察下面的结构,您可以了解一些想法。任何帮助都将不胜感激。
这是我的代码,用于检索特定值的数据。
let questionPostsRef = Database.database().reference().child("GroupChat")
let query = questionPostsRef.queryOrdered(byChild: "UserInfo/userid").queryEqual(toValue: FireStoreApp.shared.objUser.strUserID)// Here i pass userid that i want to check in firebase.
query.observeSingleEvent(of: .childAdded, with: { snapshot in
print(snapshot.value)
if !snapshot.exists() { return }
for child in snapshot.children {
let childSnap = child as! DataSnapshot
let dict = childSnap.value as! [String: Any]
print(dict)
}
})
提前感谢您的宝贵时间
答案 0 :(得分:0)
尝试以下操作:
#version 460 core
您需要从上到下遍历数据库,因此需要添加子项let questionPostsRef = Database.database().reference().child("GroupChat").child("LfY0_k5TakQ1EuPiGQU").child("UserInfo");
let query = questionPostsRef.queryOrdered(byChild:"userid").queryEqual(toValue: FireStoreApp.shared.objUser.strUserID)// Here i pass userid that i want to check in firebase.
query.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot.value)
if !snapshot.exists() { return }
for child in snapshot.children {
let childSnap = child as! DataSnapshot
let dict = childSnap.value as! [String: Any]
print(dict)
}
})
,然后才能检查child("LfY0_k5TakQ1EuPiGQU")
是否存在。
此外,当您要检查孩子是否存在时,需要使用.value
事件而不是userId
。
答案 1 :(得分:0)
第一件事是这段代码...
.queryOrdered(byChild: "UserInfo/userid")
无效,因为UserInfo没有userid的直接子代。它的孩子是0、1、2等
第二件事是;通常,最好避免在NoSQL数据库中使用数组。
一种可能的解决方案是更改您的结构以匹配您要尝试的操作。
代替
GroupChat
uid
UserInfo
0...
1...
2...
其中0、1、2是未知的...将其更改为
GroupChat
uid
UserInfo
uid_x
PhotoUrl
username
uid_y
PhotoUrl
username
uid_z
PhotoUrl
username
该结构使您很容易查看UserInfo中是否已存在一个uid,因为您将知道直接路径。它还避免了完全运行查询以节省资源(查询比直接观察者重)。这里是一些伪代码
let pathToCheck = rootRef.child("GroupChat").child(uid).child("UserInfo").child(uid_to_look_for)
然后
pathToCheck.observeSingleEvent.... { snapshot in
if snapshot.exists() {
// do something with the snapshot
} else {
print("user does not exist in group")
}
}