在 firebase 中列出所有具有规则的项目

Listing all items with rules in firebase

我有一个 firebase 数据库,用户可以在其中提交 posts。如果post是私密提交,其他用户是看不到的。

查看以下数据库和规则:

// 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"
       }
    }
  }
}

这工作正常,但只有当我通过 post 检索项目 post 时:

// 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,对吧?那么我的问题就变成了:

谢谢!

带有 public post 键的列表确实是一种选择。其他选项是创建一个单独的顶级节点,其中包含完整的 public posts.

事实上:为了能够对数据进行排序,该数据必须对用户可读。如果您只想按时间戳对它们进行排序,则可以将该时间戳作为值(而不是现在的 true)。但对于更复杂的查询,您需要复制更多数据。在某些时候,您最好复制整个 post.