firebase - 如何在 AngularFire 中的嵌套 Child 中 orderByChild ?

标签 firebase angularfire

我的firebase数据库结构如下。我想使用特定的“信息/电子邮件”进行搜索,比如说“[email protected]”。

    {  
      "-KhWrBcYyMluJbK7QpnK" : {
        "Info" : {
          "Email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8cf4f5f6ccebe1ede5e0a2efe3e1" rel="noreferrer noopener nofollow">[email protected]</a>"
        },
        "Settings" : {
          "Status" : "Accepted"
        }
      },
      "-KhX0tgQvDtDYqt4XRoL" : {
        "Info" : {
          "Email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="63020100230201004d000c0e" rel="noreferrer noopener nofollow">[email protected]</a>"
        },
        "Settings" : {
          "Status" : "Accepted"
        }
      },
      "-KhX1eo7uFnOxqncDXQ5" : {
        "Info" : {
          "Email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="89e8ebeac9e8ebeaa7eae6e4" rel="noreferrer noopener nofollow">[email protected]</a>"
        },
        "Settings" : {
          "Status" : "Pending"
        }
      }
    }

我也添加了一条规则

    "Invitation" : {
       ".indexOn": ["Info/Email","Settings/Status"]
    }

我的AngularFire代码如下:

    var rootRef = firebase.database().ref().child('Invitation');
    var userInvitations = rootRef.child("Info").orderByChild("Email").equalTo("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0b6a69684b6a696825686466" rel="noreferrer noopener nofollow">[email protected]</a>");
    var allInvitations = $firebaseArray(userInvitations);

但是我收到FIREBASE 警告:使用未指定的索引。考虑将/Invitation/Info 处的 ".indexOn": "Email"添加到您的安全规则中,以获得更好的性能。 当然,我没有收到任何数据。

我在这里犯了什么错误?我还可以添加多个orderByChild,例如:如果我想查找记录的详细信息,其中“Info/Email”等于“[email protected]”且“Settings/Status”等于“Pending”?

最佳答案

Firebase API 只允许您过滤一级深度的子​​级 因此,引用您的数据结构: 如果是这样的话,

    {  
      "-KhWrBcYyMluJbK7QpnK" : {
        "Email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d8a0a1a298bfb5b9b1b4f6bbb7b5" rel="noreferrer noopener nofollow">[email protected]</a>",
        "Settings" : {
          "Status" : "Accepted"
        }
      },
      "-KhX0tgQvDtDYqt4XRoL" : {
        "Email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="abcac9c8ebcac9c885c8c4c6" rel="noreferrer noopener nofollow">[email protected]</a>",
        "Settings" : {
          "Status" : "Accepted"
        }
      },
      "-KhX1eo7uFnOxqncDXQ5" : {
        "Email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="43222120032221206d202c2e" rel="noreferrer noopener nofollow">[email protected]</a>",
        "Settings" : {
          "Status" : "Pending"
        }
      }
    }

您应该这样编写规则。

    "Invitation" : {
       "Info" : {
          ".indexOn": "Email",
       },
       "Settings" : {
          ".indexOn": "Status",
       }
    }

然后就可以查询数据了

    var allInvitations = [];
    var rootRef = firebase.database().ref().child('Invitation');
    var userInvitations = rootRef.orderByChild("Email").equalTo("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b7d6d5d4f7d6d5d499d4d8da" rel="noreferrer noopener nofollow">[email protected]</a>");
    userInvitations.on('value', snap => {
        var invitations =  snap.val()
        for (prop in invitations ) {
         allInvitations.push(invitations[prop ]);
    
        }
        console.log(allInvitations);
    
    })

关于firebase - 如何在 AngularFire 中的嵌套 Child 中 orderByChild ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43388535/

相关文章:

ios - iOS 8与iOS 10上的Firebase动态链接行为

ios - 使用 Firebase 存储下载检测网络中断

angularjs - 使用 Facebook 登录 Angularfire 未收到扩展权限

firebase - 获取单项 firebase

javascript - $on loaded 为新引用触发一次 AngularFire 0.5.0

javascript - 将状态发布到 firebase

javascript - 如何在firebase上执行sql "LIKE"操作?

javascript - 使用 Firestore 查询发送值

firebase - 在 java 类中为 firestore 文档指定序列化名称

angular - 找不到模块 '@firebase/app-types/private' - Firebase 抛出错误