javascript - firebase实时数据库获取匹配对象的键
问题描述
我的 firebase 实时数据库的结构如下:
{
"users" : {
"P55dsK5xQaM3FhnsCcI5Oxnyi7v1" : {
"email" : "myemail@gmail.com",
"isAdmin" : true,
"name" : "Vik Kumar"
}
}
}
我正在使用 angularfire2 来查询如下数据
getUserByEmail(email:string){
console.log("start of getUserByEmail with email:" + email)
return new Promise((resolve, reject) =>
{
this.db.list("/users",
ref => ref.orderByChild('email').startAt(email)
).valueChanges().subscribe(
res => {
console.log('response:' + JSON.stringify(res))
resolve(res)
},
err => {
console.log(err)
reject(err)
}
)
})
}
这按预期工作。但是,我还需要此节点“P55dsK5xQaM3FhnsCcI5Oxnyi7v1”的 id 来执行一些操作。我怎么得到那个?
我的业务用例 用户在注册时被添加到备注用户节点。上述要求来自管理员用户想要更新用户数据的地方。因此,他通过电子邮件搜索用户,然后对其进行更新。
所以上面的代码用于通过电子邮件搜索用户。现在,为了能够更新,我需要获取节点 ID。
解决方案
我不确定你为什么在这里使用 AngularFire。使用适用于 JavaScript 的常规 Firebase SDK,您可以通过以下方式执行此操作:
getUserByEmail(email:string){
console.log("start of getUserByEmail with email:" + email)
return new Promise((resolve, reject) =>{
firebase.database()
.ref("/users")
.orderByChild('email')
.startAt(email)
.once('child_added')
.then(snapshot => {
resolve(snapshot.key);
})
.catch(err => {
console.log(err)
reject(err)
})
});
}
通过监听,once('child_added'
我们得到一个snapshot
只包含与查询匹配的第一个子节点。
请注意,现在搜索将匹配之后的任何用户email
,而我感觉您只想找到以的值开头的用户email
。在这种情况下,您还需要添加一个endAt()
子句:
firebase.database()
.ref("/users")
.orderByChild('email')
.startAt(email)
.endAt(email+'\uF7FF')
.once('child_added')
推荐阅读
- php - 在 Woocommerce 验证结帐表单中处理多个子字符串
- javascript - setInterval/setTimeout 一次获取消息的问题
- apache - 如何在 apache 反向代理下在两个条件下进行反向
- c# - 如何覆盖“制表符”键行为以完成控制台中的输入?
- php - 注意:尝试访问 null 类型值的数组偏移量
- c# - 我可以使用从 iOS 生成的公钥,在 c# 代码中加密数据并再次在 iOS 中解密加密数据(使用私钥)吗?
- git - 如何将文件重置为某个提交?
- c# - 如何通过 vb.net 让其他应用程序(计算器)在 winforms 中脱颖而出?
- signals - POSIX:为什么 sigwait 需要信号阻塞?
- php - PHP服务器退出信号:被杀死