我的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)
}
)
})
}
这按预期工作。但是,我需要此节点的ID“ P55dsK5xQaM3FhnsCcI5Oxnyi7v1”以及执行某些操作。我怎么得到的?
我的业务用例
用户在注册时被添加到注释用户节点。上面的要求来自管理员用户想要更新用户数据的地方。因此,他通过电子邮件搜索用户,然后对其进行更新。
因此,以上代码用于通过电子邮件搜索用户。现在,要进行更新,我需要获取节点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')