Firebase实时数据库获取匹配对象的密钥

时间:2018-08-14 00:44:23

标签: javascript firebase firebase-realtime-database angularfire2

我的firebase实时数据库的结构如下:

id: user._id

我正在使用angularfire2查询以下数据

{
 "users" : {
    "P55dsK5xQaM3FhnsCcI5Oxnyi7v1" : {
      "email" : "myemail@gmail.com",
      "isAdmin" : true,
      "name" : "Vik Kumar"
    }
  }
}

这按预期工作。但是,我需要此节点的ID“ P55dsK5xQaM3FhnsCcI5Oxnyi7v1”才能执行一些操作。我怎么得到的?

我的业务用例 用户在注册时被添加到注释用户节点。上面的要求来自管理员用户想要更新用户数据的地方。因此,他通过电子邮件搜索用户,然后对其进行更新。

因此,以上代码用于通过电子邮件搜索用户。现在,要进行更新,我需要获取节点ID。

3 个答案:

答案 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()给我数据对象。