0

我有一个firebase数据库,用户可以在其中提交posts。如果帖子是私人提交的,其他用户无法阅读。列出所有包含firebase规则的项目

看到数据库和规则如下:

// FIREBASE DATABASE: 
{ 
    "posts" : { 
    "-PaNtmNIFp9sTT549-Kn" : { 
     "author" : "XXXYYY", 
     "content" : "New post", 
     "public" : true 
    }, 
    "-PaNw0ak27MfcU5Vff1t" : { 
     "author" : "XXXYYY", 
     "content" : "Secret post", 
     "public" : false 
    }, 
    "-PaOPhX3SwRe2ThEFWJo" : { 
     "author" : "XXXYYY", 
     "content" : "another post", 
     "public" : true 
    } 
    }, 
    "user-posts" : { 
    "XXXYYY" : { 
     "-PaNtmNIFp9sTT549-Kn" : true, 
     "-PaNw0ak27MfcU5Vff1t" : true, 
     "-PaOPhX3SwRe2ThEFWJo" : true 
    } 
    } 
} 

// RULES: 
{ 
    "rules": { 
    "posts": { 
     "$post": { 
     ".read": "auth !== null && data.child('public').val() === true || data.child('author').val() === auth.uid" 
     } 
    } 
    } 
} 

这工作得很好,但只有当我取回物品后邮寄:

// DOES NOT WORK 
firebase.database().ref().child('posts').on('value', snap => { 
    console.log(snap.val()) 
}); 

// DOES WORK 
var children = ["-PaNtmNIFp9sTT549-Kn", "-PaNw0ak27MfcU5Vff1t", "-PaOPhX3SwRe2ThEFWJo"]; 
children.forEach(function(child) { 
    rootRef.child(child).on('value', snap => { 
    console.log(snap.val()) 
    }) 
}) 

我想这Rules are not Filters,对不对?然后我的问题变成:

  • 我该如何提示用户使用正确的实体来寻找?我应该使用所有公共帖子密钥创建单独的节点,即名为publicPosts
  • 如果我仍然希望能够按照他们的内容对公共帖子进行排序,我该如何去做这件事?只需在新节点publicPosts中复制可能与查询相关的所有数据?

谢谢!

回答

1

与公共职位的关键清单确实是一种选择。其他选项是使用完整的公共帖子创建单独的顶级节点。

事实上:为了能够对数据进行排序,该数据必须对用户可读。如果您只是想通过时间戳来订购它们,则可以将该时间戳记作为值(而不是您现在的true)。但是对于更复杂的查询,您需要复制更多数据。在某个时候,你会喜欢复制整篇文章。