Javascript 如何构造Firebase实时数据库读取请求:按键排序';孩子

Javascript 如何构造Firebase实时数据库读取请求:按键排序';孩子,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我将数据存储在firebase实时数据库中,格式如下 users: -L5ZAb7r10_nqss7Ag: role: "user" email: "person@example.com" username: "King Arthur" -KL3Abnar7_nals8: role: "admin" email: "other@example.com" username: "Queen

我将数据存储在firebase实时数据库中,格式如下

users:
    -L5ZAb7r10_nqss7Ag:
        role: "user"
        email: "person@example.com"
        username: "King Arthur"
    -KL3Abnar7_nals8:
        role: "admin"
        email: "other@example.com"
        username: "Queen Ferdinand"
数据库.rules.json
中,我有:

"users":{
  ".indexOn":["email"],
  ".write": false,
  ".read": "auth != null"
},
在前端,我有一个用户发送了他们的电子邮件,已经通过了Google OAuth的身份验证,我想看看他们的电子邮件是否是有效用户,如果是,请返回他们的角色和用户名,否则会抛出一个错误。现在我循环浏览n个帐户,检查每个帐户的电子邮件。O(n)显然是一个非常糟糕的运行时

由于不知道数据库中的用户密钥是什么(“-L5ZAb7r10_nqss7Ag”部分),我希望能够通过搜索索引数据库中的电子邮件来检查O(1)中的给定电子邮件。我想到的是下面这样的东西。如果可以,有人能告诉我riht文档的正确语法吗

firebase.database().ref(`/users/`).getIndexedValue($key/person@example.com).once('value').then(function(snap){
    if(snap == null) console.log("error);
    else{
       user = snap.val();
       console.log(user[role]);
       console.log(user[username]);
    }
}

我知道上面的方法行不通,
.getIndexedValue()
不是真的。此功能的正确语法是什么?是否有办法查找位于任意部分(即
-kl3abnar8
)下方的特定索引值(电子邮件)?

您正在查找
orderByChild()
equalTo()
。大概是这样的:

firebase.database()
  .ref('users')
  .orderByChild('email')
  .equalTo('person@example.com')
  .once('value').then(function(snapshot){
    if (snapshot.exists()) {
      snapshot.forEach(function(snap) {
       user = snap.val();
       console.log(user[role]);
       console.log(user[username]);
      })
    }
}

要了解有关Firebase数据库查询的更多信息,请参阅。我还建议您检查一下以前的版本。

谢谢您的帮助!