javascript - 如何构造 Firebase Realtime DB 读取请求:按 Key 的子级排序
问题描述
我将数据存储在 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()
不是真的。此功能的正确语法是什么?有没有办法寻找位于任意部分(the)下方的特定索引值(电子邮件-KL3Abnar7_nals8
)?
解决方案
您正在寻找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 数据库查询的更多信息,请参阅有关排序和过滤数据的文档。我还建议检查有关该主题的一些先前问题。
推荐阅读
- python - Python:合并两个 csv 文件并在主数据和使用数据中标记不匹配的文件
- python-3.x - 将 python 列表转换为 np.array 时出现问题。进程正在删除 sting 类型的数据
- asp.net-mvc - 我的自定义授权属性始终重定向到未经授权的页面
- python - AsyncGenerator 上的异步 for 循环
- reactjs - React Webcam 组件在 chrome 扩展中不起作用
- swift - Xcode / 斯威夫特 | 单击 UITextField 时按钮动画会自动重置
- sql - 像运算符正则表达式在 Posgresql 中无法按预期工作
- sql - 在查询中拆分 XML 字段
- sql - 在 SQL 中使用 Month(dateField) 统计每个月的记录
- amazon-web-services - ElasticBeanstalk 尝试在authorized_keys 中添加ssh 访问