如何在Firebase-DB中查询“ WHERE”子句之类的数据?

时间:2019-02-17 19:42:18

标签: android firebase firebase-realtime-database nosql

我正在使用Firebase开发适用于Android的联系人应用程序,我想从数据库中与指定电子邮件匹配的用户中读取值(此处为用户个人资料)。

我试图设计查询,如以下答案所示:https://stackoverflow.com/a/39025129/8739722,但问题是我不知道如何将其应用于数据库结构,因为我的用户中有另一个孩子(配置文件)结构。

我的节点如下:

examplary-users-nodes

我的规则如下:

{
"rules": {
    "users": {
      "$uid": {
        "profile": {
          ".read": "auth.uid != null",
          ".write": "auth.uid == $uid",
        },
        //...
    },
}

我试图这样查询:

String email = "email_address_1";
Query q_1 = ref.child("users").child("profile").orderByChild("email").equalTo(email);

...导致“权限被拒绝”错误。

我也考虑过以下查询,但是它们的语法无效或尝试执行不允许的多个orderByChild调用:

String email = "email_address_1";
Query q_2 = ref.child("users").orderByChild("profile").child("email").equalTo(email);
Query q_3 = ref.child("users").orderByChild("profile").orderByChild("email").equalTo(email);

如何通过匹配的电子邮件获取用户的个人资料?

1 个答案:

答案 0 :(得分:0)

Firebase实时数据库查询对单个属性进行过滤和排序,该属性位于运行查询的位置的每个子节点下的固定路径/名称下。在您的情况下,该属性位于profile/email下,因此您的查询变为:

ref.child("users").orderByChild("profile/email").equalTo(email);

但是请注意,您的规则将拒绝此查询,因为它们请求从/users读取数据,并且您不授予任何人从那里读取数据的权限。当您附加侦听器时,将强制执行Firebase安全规则,并且不能用于过滤数据。要了解更多有关此内容的信息,请阅读文档部分rules are not filters和许多questions mentioning that same phrase

要快速测试以上查询,您可以临时授予对/users的所有访问权限。只需确保将其更改回与任何用户共享您的应用程序。

要正确保护数据,您需要在安全规则中验证用户仅尝试读取自己的数据。您可以使用query based security rules进行此操作。在您的情况下,它们看起来像这样:

"users": {
  ".read": "auth.email != null &&
            query.orderByChild == 'profile/email' &&
            query.equalTo == auth.token.email"
}