如何在angularfire中的嵌套子中命令BiChild?

时间:2017-04-13 09:31:02

标签: firebase angularfire

我的firebase数据库结构如下。我想用特定的“信息/电子邮件”进行搜索,让我们说“abc@abc.com”。

{  
  "-KhWrBcYyMluJbK7QpnK" : {
    "Info" : {
      "Email" : "xyz@gmail.com"
    },
    "Settings" : {
      "Status" : "Accepted"
    }
  },
  "-KhX0tgQvDtDYqt4XRoL" : {
    "Info" : {
      "Email" : "abc@abc.com"
    },
    "Settings" : {
      "Status" : "Accepted"
    }
  },
  "-KhX1eo7uFnOxqncDXQ5" : {
    "Info" : {
      "Email" : "abc@abc.com"
    },
    "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("abc@abc.com");
var allInvitations = $firebaseArray(userInvitations);

但我得到一个 FIREBASE警告:使用未指定的索引。考虑在/ Invitation / Info添加“.indexOn”:“电子邮件”到您的安全规则以获得更好的性能。当然我没有收到任何数据。

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

1 个答案:

答案 0 :(得分:1)

Firebase API仅允许您深一层过滤子级 因此,参考您的数据结构: 如果是这样,

{  
  "-KhWrBcYyMluJbK7QpnK" : {
    "Email" : "xyz@gmail.com",
    "Settings" : {
      "Status" : "Accepted"
    }
  },
  "-KhX0tgQvDtDYqt4XRoL" : {
    "Email" : "abc@abc.com",
    "Settings" : {
      "Status" : "Accepted"
    }
  },
  "-KhX1eo7uFnOxqncDXQ5" : {
    "Email" : "abc@abc.com",
    "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("abc@abc.com");
userInvitations.on('value', snap => {
    var invitations =  snap.val()
    for (prop in invitations ) {
     allInvitations.push(invitations[prop ]);

    }
    console.log(allInvitations);

})