首页 > 解决方案 > 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。

标签: javascriptfirebasefirebase-realtime-databaseangularfire2

解决方案


我不确定你为什么在这里使用 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')

推荐阅读