我的firebase实时数据库的结构如下:
id: user._id
我正在使用angularfire2查询以下数据
{
"users" : {
"P55dsK5xQaM3FhnsCcI5Oxnyi7v1" : {
"email" : "myemail@gmail.com",
"isAdmin" : true,
"name" : "Vik Kumar"
}
}
}
这按预期工作。但是,我需要此节点的ID“ P55dsK5xQaM3FhnsCcI5Oxnyi7v1”才能执行一些操作。我怎么得到的?
我的业务用例 用户在注册时被添加到注释用户节点。上面的要求来自管理员用户想要更新用户数据的地方。因此,他通过电子邮件搜索用户,然后对其进行更新。
因此,以上代码用于通过电子邮件搜索用户。现在,要进行更新,我需要获取节点ID。
答案 0 :(得分:1)
我不确定您为什么在这里使用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')
答案 1 :(得分:0)
您可以这样尝试
this.itemsRef = db.list('users');
this.itemsRef.snapshotChanges(['child_added'])
.subscribe(actions => {
actions.forEach(action => {
console.log(action.type);
console.log(action.key);
console.log(action.payload.val());
});
});
答案 2 :(得分:0)
所以,实际上我可以使用angularfire2做到这一点,方法是将valueChanges替换为如下所示的快照更改
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)
).snapshotChanges().subscribe(
(res:any) => {
console.log("resp length:" + res.length)
//console.log('response:' + JSON.stringify(res))
//console.log('key is::' + res.key())
resolve(res)
},
err => {
console.log(err)
reject(err)
}
)
})
}
现在res.key给我键,res.payload.val()给我数据对象。