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

wsxa1bj1  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(143)

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


的数据
我想得到所有的对象,有我通过参数发送的电子邮件,我使用.child访问到我的对象的查尔兹,但我没有成功的查询,这是我的代码

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

字符串
snapshot.瓦尔()始终未定义。
能帮我查询一下吗?

6g8kf2rb

6g8kf2rb1#

一个有效的方法来获得“所有的组,有该电子邮件内的成员对象”将是反规范化你的数据,并有另一个“主节点”在您的数据库中,您存储所有的“成员”(即他们的电子邮件)和“组”,他们属于。
这意味着,每次在“组”(包括其电子邮件)下添加“成员”节点时,您也会将该组作为成员电子邮件的子节点添加到另一个“主节点”中。
更具体地说,数据库结构是这样的:

您目前的结构:

- groups
  - -LB9o....
   ...
   - members
     - -LB9qbd....
       -email: [email protected]
     - -LBA7R....
       -email: [email protected]

字符串

额外的结构:

- groupsByMembers
   - xxxxxx@zzzcom
     - Grupo1: true
   - yyyyy@aaaacom
     - Grupo1: true
     - Grupo2: true
   - bbbcccc@dddcom
     - Grupo6: true
     - Grupo8: true

  • 请注意,在“额外结构”中,电子邮件地址中的点被删除,因为您不能在节点ID中包含点。您必须在写入和查询时相应地删除它们。*

通过这种方式,您可以轻松地查询成员所属的组列表,如下所示。无需在多个项目上循环多次。这种dernomalization技术在NoSQL数据库中非常经典。

const mailToSearchFor = [email protected];
    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);
            }
        }
    });


为了同时写入两个数据库节点,请使用update方法,如此处所述https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

c90pui9n

c90pui9n2#

这是因为你在members之前有一个随机键,你需要遍历路径而不是跳过一个节点,才能访问值:

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

字符串

相关问题