如何从firebase函数访问查询数据库中的另一个对象?

时间:2018-04-29 08:30:31

标签: firebase firebase-realtime-database google-cloud-functions

我正在尝试访问我的firebase数据库中的另一个对象,我有这样的结构:

enter image description here

我想获取所有带有我通过参数发送的电子邮件的对象,我使用.child访问我的对象的孩子,但我对查询不成功,这是我的代码

$ ref_db.child("/groups").child("members").orderByChild("email").equalTo(email).once("value", (snapshot)=>{
      console.log(snapshot.val());
    }); 

snapshot.val()始终未定义。

你可以帮我查询一下吗?

2 个答案:

答案 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()); 
});