在 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 posts 键创建一个单独的节点,即称为
publicPosts
?
- 如果我仍然希望能够根据内容对 public post 上的查询进行排序,我该怎么做呢?只需复制所有可能与新节点中的查询相关的数据
publicPosts
?
谢谢!
带有 public post 键的列表确实是一种选择。其他选项是创建一个单独的顶级节点,其中包含完整的 public posts.
事实上:为了能够对数据进行排序,该数据必须对用户可读。如果您只想按时间戳对它们进行排序,则可以将该时间戳作为值(而不是现在的 true
)。但对于更复杂的查询,您需要复制更多数据。在某些时候,您最好复制整个 post.
我有一个 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 posts 键创建一个单独的节点,即称为
publicPosts
? - 如果我仍然希望能够根据内容对 public post 上的查询进行排序,我该怎么做呢?只需复制所有可能与新节点中的查询相关的数据
publicPosts
?
谢谢!
带有 public post 键的列表确实是一种选择。其他选项是创建一个单独的顶级节点,其中包含完整的 public posts.
事实上:为了能够对数据进行排序,该数据必须对用户可读。如果您只想按时间戳对它们进行排序,则可以将该时间戳作为值(而不是现在的 true
)。但对于更复杂的查询,您需要复制更多数据。在某些时候,您最好复制整个 post.