如何在 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 子句?