我正在尝试访问我的firebase数据库中的另一个对象,我有这样的结构:
我想获取所有带有我通过参数发送的电子邮件的对象,我使用.child访问我的对象的孩子,但我对查询不成功,这是我的代码
$ ref_db.child("/groups").child("members").orderByChild("email").equalTo(email).once("value", (snapshot)=>{
console.log(snapshot.val());
});
snapshot.val()始终未定义。
你可以帮我查询一下吗?答案 0 :(得分:1)
获取“在成员对象中包含该电子邮件的所有组”的一种有效方法是对数据进行非规范化,并在数据库中设置另一个“主节点”,用于存储所有“成员”(即他们的电子邮件)和他们所属的“团体”。
这意味着每次在“组”(包括其电子邮件)下添加“成员”节点时,您还会将该组作为成员电子邮件的子项添加到此另一个“主节点”中。
更具体地说,这是数据库结构如何:
您当前的结构:
- groups
- -LB9o....
...
- members
- -LB9qbd....
-email: xxxx@zzz.com
- -LBA7R....
-email: yyyyy@aaaa.com
额外的结构:
- groupsByMembers
- xxxxxx@zzzcom
- Grupo1: true
- yyyyy@aaaacom
- Grupo1: true
- Grupo2: true
- bbbcccc@dddcom
- Grupo6: true
- Grupo8: true
请注意,在“额外结构”中,电子邮件地址中的点将被删除,因为您无法在节点ID中包含一个点。在编写和查询时,您必须相应地删除它们。
通过这种方式,您可以轻松查询成员所属的组列表,如下所示。无需在多个项目上循环多次。这种dernomalization技术在NoSQL数据库中非常经典。
const mailToSearchFor = xxxx.xx@zzz.com;
const ref = database.ref('/groupsByMembers/' + mailToSearchFor.replace(/\./g, ''));
ref.once('value', snapshot => {
const val = snapshot.val();
for (let key in val) {
if (val.hasOwnProperty(key)) {
console.log(key);
}
}
});
为了同时写入两个数据库节点,请使用https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields
中所述的update
方法
答案 1 :(得分:0)
这是因为你在members
之前有一个随机密钥,你需要通过路径而不是跳过一个节点,才能访问这些值:
ref_db.child("groups").child("-LB9oWcnE0wXx8PbH4D").child("members").orderByChild("email").equalTo(email).once("value", (snapshot)=>{
console.log(snapshot.val());
});