如何列出所有有规则的项目;。改为;这在Firebase中是真的吗?
我有以下结构数据:如何列出所有有规则的项目;。改为;这在Firebase中是真的吗?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我有以下结构数据: { "test" : { "a" : { "view" : true }, "b" : { "view" : false }, "c" : { "view" : true } } } 我有以下规则: { "rules": { "test": { // ".read": true, "$id": { ".read": "data.ch
{
"test" : {
"a" : {
"view" : true
},
"b" : {
"view" : false
},
"c" : {
"view" : true
}
}
}
我有以下规则:
{
"rules": {
"test": {
// ".read": true,
"$id": {
".read": "data.child('view').val() === true"
}
}
}
}
使用以下代码:
ref.child('test/a').once('value',snap=>{
console.log('a:',snap.val())
})
ref.child('test/b').once('value',snap=>{
console.log('b:',snap.val())
})
ref.child('test').once('value',snap=>{
console.log('all:',snap.val())
})
我只得到:
a: Object {view: true}
我希望得到这个结果(注意all
中b
是如何丢失的):
如果我在第4行的安全规则中取消注释“.read”:true
,我得到了一切,而这不是我想要的
如何列出所有具有规则“.read”且在Firebase中计算结果为true的项?
更新:
要获得预期的a
和c
的唯一方法似乎是创建一个包含所有项的数组:
{
"items" : [ "a", "b", "c" ],
"test" : {
"a" : {
"view" : true
},
"b" : {
"view" : false
},
"c" : {
"view" : true
}
}
}
规则:
{
"rules": {
"test": {
"$id": {
".read": "data.child('view').val() === true"
}
},
"items" :{
".read": true
}
}
}
然后使用以下代码获得预期结果:
ref.child('items').once('value',snap=>{
snap.forEach(item=>{
ref.child('test/'+item.val()).once('value',snap=>{
console.log(snap.key)
})
})
})
Firebase安全规则无法用于筛选数据,这正是您尝试执行的操作。在Firebase文档或本网站上搜索“规则不是过滤器”以了解更多信息。我想我现在明白了,规则主要用于设置用户对数据的访问权限。最初我认为我可以从规则中过滤数据,最大限度地减少代码错误授予访问权限的可能性。你可以做到这一点:确保没有人能够读取他们无权访问的项目。但是,您不能同时查询同一个集合以获得仅包含用户有权访问的项的列表。
ref.child('items').once('value',snap=>{
snap.forEach(item=>{
ref.child('test/'+item.val()).once('value',snap=>{
console.log(snap.key)
})
})
})