如何列出所有有规则的项目;。改为;这在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)
    })
  })
})