我的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/