Angularfire2更新记录

Angularfire2更新记录,angular,firebase,firebase-realtime-database,angular5,angularfire2,Angular,Firebase,Firebase Realtime Database,Angular5,Angularfire2,我是angular的新手,我正在开发一个小型web应用程序 我已经成功地设置了angularfire 2,并成功地使用Push()创建了一个新的列表条目 假设我的列表(用户)由用户电子邮件和名字组成。只有电子邮件是通过Push方法添加的,我想通过添加名字来更新该记录 我参考了Angularfire2文档,并设法做到了这一点: usrEmail: string; usrData: AngularFireList<any>; usr: Observable<any>;

我是angular的新手,我正在开发一个小型web应用程序

我已经成功地设置了angularfire 2,并成功地使用Push()创建了一个新的列表条目

假设我的列表(用户)由用户电子邮件和名字组成。只有电子邮件是通过Push方法添加的,我想通过添加名字来更新该记录

我参考了Angularfire2文档,并设法做到了这一点:

 usrEmail: string;
 usrData: AngularFireList<any>;
 usr: Observable<any>;


  constructor( private authService: AuthService, private afd: AngularFireDatabase) {


    this.usrData = this.afd.list('/users')
    // now get the current user
    this.usr = this.usrData.snapshotChanges().map(changes => {
      return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
     });

  }
usrEmail:string;
usrData:角度火工队;
usr:可观察;
构造函数(专用authService:authService,专用afd:AngularFireDatabase){
this.usrData=this.afd.list(“/users”)
//现在获取当前用户
this.usr=this.usrData.snapshotChanges().map(更改=>{
返回changes.map(c=>({key:c.payload.key,…c.payload.val()}));
});
}
我不确定如何通过usrEmail过滤列表,并获取更新记录的密钥


非常感谢为我指明正确方向的任何帮助。

您使用的查询将获得所有
/users
而不仅仅是具有匹配电子邮件地址的单个用户

我假设您可以访问电子邮件地址,并且它被分配给变量
userEmailAddress

this.usr = this.afd.list('/users', ref => ref
  .orderByChild('usrEmail')
  .equalTo(userEmailAddress)
)
.snapshotChanges()
.map(changes => {
  return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
})
.first()
.subscribe(snapshots => {
  snapshots.forEach(snapshot => {
    console.log('Snapshot Key: ', snapshot.key);
    console.log('Snapshot Payload: ', snapshot.val());
  });
});
snapshot.key的输出将是您试图获取的密钥

但是,在您的场景中,有更好的方法存储客户的电子邮件地址。您可以在数据库中创建包含用户id的路径,例如

我假设您可以通过authService访问uid
this.authService.uid

this.afd.object(`/users/${this.authService.uid}`).update({
  email: userEmailAddress
});

用户的
uid
将永远不会更改,并且它是该用户独有的,因此您可以使用它创建数据库路径,以便于访问。

非常感谢您的快速响应。非常感谢,你建议的方法是一个更好的设计。一个简单的说明,我可以使用push()创建一个新路径吗?稍后将测试代码并标记为已应答:)Push用于生成唯一路径。如果您执行类似于
this.afd.list(
/users/${this.authService.uid}
).push({email:userEmailAddress})的操作它会生成一个路径,比如“代码> /用户/ SOMUIDID/SAMEANDANMOPHIGKE/EMAIL <代码>,这是一个长路径,在路径的中间有<代码> SAMEANDANMOPUPKEY < /COD>,这使得解码很困难。然而,如果使用
设置
更新
,它将写入您指定的路径,而无需添加额外的键。路径应该是
/users/someUid/email
,这要短得多。