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

Posted

技术标签:

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

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

我尝试设计如下答案所示的查询:https://***.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);

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

【问题讨论】:

您可以添加数据库节点的图像吗? 是的,我添加了节点的图像。 【参考方案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"

【讨论】:

虽然这个查询有效,但如果数据集很大,执行起来会花费太多时间。 如果您对查询有性能问题,请通过enough information for us to reproduce the issue 发布新问题。

以上是关于如何在 Firebase-DB 中查询“WHERE”子句之类的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 graphql 和 mongodb 的查询中使用“where”参数?

如何使用查询构建在 Laravel 中执行 WHERE NOT

如何在 30 天记录之前在 mysql 查询中添加 where 条件

如何在 SQL 查询中动态跳过没有 If else 的 where 子句?

如何在标准 SQL 的 WHERE 子句中使用 WITH 子查询作为选项列表

如何使用在 where 子句中具有父属性的休眠查询更新数据