【问题标题】:How to access an object into another object in a query database from firebase functions?如何从firebase函数将一个对象访问到查询数据库中的另一个对象?
【发布时间】:2018-04-29 08:30:31
【问题描述】:

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

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

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

snapshot.val() 总是未定义的。

你能帮我查询一下吗?

【问题讨论】:

  • 除了 Peter 和 Renaud 的回答,还请阅读我的回答 herehere

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


【解决方案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 中包含点。您必须在编写和查询时相应地删除它们。

这样您就可以轻松查询成员所属的群组列表,如下图所示。无需在多个项目上循环多次。这种去神经元化技术在 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);
            }
        }
    });

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢彼得!有用!但是,如果我想在 members 对象中获取所有包含该电子邮件的组怎么办?你知道怎么做吗?
    • 将快照放在子groups,然后使用forEachgroups 内循环,然后获取members 的值并在其中循环使用forEach 并获取电子邮件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2016-06-10
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多