我的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”?
答案 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);
})