我必须通过提供其电子邮件来获取用户的ID。我的结构是:
users
-Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2
-email: "batuarslan@gmail.com"
-lists
slid: "-LJsrWDfMPNcs_NjVYBM"
uid: "Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2"
有没有办法做到这一点?还是我必须以其他方式重组我的树?我的代码:
func userLookUpByEmail (email: String, completionHandler: @escaping (_ result: String) -> Void) {
var userId : String = ""
usersRef.queryOrdered(byChild: "email").queryEqual(toValue: email).observeSingleEvent(of: .value, with: { snapshot in
if snapshot.value != nil {
userId = snapshot.key
}
else {
userId = "nil"
}
completionHandler(userId)
})
}
func userLookUpByEmail (email: String, completionHandler: @escaping (_ result: String) -> Void) {
var userId : String = ""
usersRef.queryOrdered(byChild: "email")
.queryEqual(toValue: email)
.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.value != nil {
userId = snapshot.key
}
else {
userId = "nil"
}
completionHandler(userId)
})
}
答案 0 :(得分:0)
Firebase数据库结构文档建议使用带有两个方向性条目的扁平结构,可以添加冗余以加快查找速度。
请参阅https://firebase.google.com/docs/database/ios/structure-data的链接“创建可缩放的数据”
要扩展有效方式,应在索引中添加类似于“ SQL中的外键”的两个方式条目。
例如,在您的情况下: 您在显示的代码中尝试执行的操作没有任何问题。但是为了扩展它,添加了一个新的节点电子邮件哈希(因为电子邮件不能用作节点/子节点),最好与您的用户节点同级。该电子邮件哈希节点应存储电子邮件哈希到uid的映射。
users
-Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2
-email: "batuarslan@gmail.com"
-lists
slid: "-LJsrWDfMPNcs_NjVYBM"
uid: "Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2"
...
...
...
emails
-<md5 hash of "batuarslan@gmail.com">: "Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2"
...
...
...
因此,lookupByEmail首先应为输入电子邮件生成md5哈希,然后在emailhashhes节点中查找emailhash以获取相应的uid,然后使用lookupByUID获取用户数据。
要生成电子邮件的md5哈希,请参考:How to convert string to MD5 hash using ios swift
通过应用数据库规则在Firebase实时数据库上建立索引。请参阅:
https://firebase.google.com/docs/database/security/indexing-data