【问题标题】:Firebase : How to read every child node in parent except children with particular dataFirebase:如何读取父节点中的每个子节点,除了具有特定数据的子节点
【发布时间】:2016-07-16 23:18:58
【问题描述】:

假设如下。

posts : {
      "$postid":{
               "meta":{
                      "state":true,
                      "text" :"I should be read",
               },
               "likes":{
                      "uid1":true,
                      "uid2":true,
               },
       },
       "$postid":{
               "meta":{
                      "state":false,
                      "text" :"I should be read",
               },
               "likes":{
                      "uid1":true,
                      "uid2":true,
                      "uid3":true,
               },
       }
}

我想查询父节点('posts')如下。

  • 省略 state = false 的帖子
  • 优先考虑获得最多赞的帖子

安全规则

  • 拒绝阅读 state == false 的帖子。

这是我如何查询数据的 Javascript 版本。 ////$.fdr === firebase.database.ref();

$.fdr("posts").orderByChild("time").limitToLast(20).once('value',function(r) {
    var r = r.val();
    if(r !== null){                 
        ///use r;  
    }
},function(e){
        console.log(e);
}); 

为什么这样:我希望用户删除帖子,并且以后能够撤消删除。 要删除,我将“post.meta.state”的值更改为“false”。 虽然“post.meta.state”为假,但安全规则不应允许读取该帖子。

问题:如果我在帖子节点而不是父节点(“posts”)中设置规则,

 "postid": { 
             ".read":"data.child('state').val() == true"
           }

然后我可以限制“.read”,但前提是我会按如下方式查询帖子:

firebase.database.ref("posts/postid");

否则,如果我尝试从父节点查询:

firebase.database.ref("posts/"), 

这样我就可以过滤掉我不想返回的帖子,然后我必须将规则从“帖子”子级提升到“帖子”(父级),这将导致子级中的规则被忽略,而且我似乎无法找到一种方法来拒绝返回带有“状态”== false 的帖子;

以上是我目前的理解,请纠正我迷路的地方。

【问题讨论】:

  • 你无疑已经尝试了一些东西。请分享您尝试过的内容以及显示您遇到问题的最少代码。至少这会告诉我们您的目标平台是什么。但它更有可能让我们更好地了解如何为您提供帮助。
  • @FrankvanPuffelen 请查看新的编辑。

标签: firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

不幸的是,当用户作为读/写父节点的权限时,不可能阻止对任何子节点的读/写。您可以在Firebase Docs 中阅读有关安全规则如何级联的更多信息。

也就是说,有几个可能的解决方案供您考虑:

  1. 您可以将帖子移出到单独的父节点,而不是将帖子标记为已删除。然后你可以调整deleted_posts的安全规则来隐藏它。

    {
      "posts": {
        "$postid1": {
          "meta": {
            "state": true,
            "text": "I should be readable"
          },
          "likes": {
            "uid1": true,
            "uid2": true,
            "uid3": true
          }
        }
      }
      "deleted_posts": {
        "$postid2": {
          "meta": {
            "state": false,
            "text": "I should not be readable"
          },
          "likes": {
          }
        }
      }
    }
    
  2. 保留一个单独的可见 postid 列表,并将“posts”节点设置为不可读,但如果不隐藏,则子节点设置为可读。您必须进行第二次查询才能获取每个帖子的数据:

    {
      "posts": {
        "$postid1": {
          "meta": {
            "state": true,
            "text": "I should be readable"
          },
          "likes": {
            "uid1": true,
            "uid2": true,
            "uid3": true
          }
        },
        "$postid2": {
          "meta": {
            "state": false,
            "text": "I should not be readable"
          },
          "likes": {}
        },
        "$postid3": {
          "meta": {
            "state": true,
            "text": "I should be readable"
          },
          "likes": {}
        }
      },
      "visible_posts": {
        "$postid1": true,
        "$postid3": true
      }
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多