【问题标题】:How to query Firebase-DB for data like 'WHERE'-clause?如何在 Firebase-DB 中查询“WHERE”子句之类的数据?
【发布时间】:2019-07-11 05:27:58
【问题描述】:

我正在开发一个带有 firebase 的 android 联系人应用程序,我想从我的数据库中与指定电子邮件匹配的用户读取值(这里:用户的个人资料)。

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

我的节点如下所示:

我的规则如下所示:

{
"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);

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

【问题讨论】:

  • 您可以添加数据库节点的图像吗?
  • 是的,我添加了节点的图像。

标签: android firebase firebase-realtime-database nosql


【解决方案1】:

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"
}

【讨论】:

猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多