如何构造Firebase实时数据库读取请求:按Key的孩子排序

时间:2018-11-15 15:07:29

标签: 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 Ferdinand"

database.rules.json中,我有:

"users":{
  ".indexOn":["email"],
  ".write": false,
  ".read": "auth != null"
},

在前端,我有一个用户在使用Google OAuth进行身份验证,并提供了他们的电子邮件,我想查看他们的电子邮件是否是有效用户,如果是,请返回其角色和用户名,否则将引发错误。现在,我循环浏览“ n”个帐户并检查每个帐户的电子邮件。 O(n)显然是一个很糟糕的运行时。

不知道数据库中用户的密钥是什么(“ -L5ZAb7r10_nqss7Ag”部分),我希望能够通过在索引数据库中搜索电子邮件来检查O(1)中的给定电子邮件。我想到的是类似下面的内容。如果这很容易出错,有人可以指出我的正确文档吗?

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()不是真实的。此功能的正确语法是什么?是否有某种方法可以查找位于任意部分(-KL3Abnar7_nals8)之下的特定索引值(电子邮件)?

1 个答案:

答案 0 :(得分:1)

您正在寻找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数据库查询的更多信息,请参阅documentation on sorting and filtering data。我也建议您检查以前的questions on the topic