我通读了一下collection group query documentation,想知道为了让收集组查询正常工作,递归通配符(rules_version = '2'
) {path=**}
是否是必需的。
我将给您一个示例(遵循文档中的示例):
forums/{forum}/posts/{post}
.
forums
集合。posts
.forums/{forum}/posts/{post}
.以下两个片段都将成功匹配所有帖子:
match /forums/{forum}/posts/{post} {
allow list;
}
match /{path=**}/posts/{post} {
allow list;
}
如果我正确理解了文档,第一个match
将不足以使posts
上的收集组查询正常工作。
我知道第二个match
也将匹配任何其他名为posts
的子集。
第一个match
就足够了吗?
如果不是,递归通配符{path=**}
是否总是必须是顶级的,即直接在match /databases/{database}/documents
中?文档让它看起来就像是这样。
发布于 2019-05-09 03:43:31
文档表明,您的第一条规则不足以允许对帖子进行收集组查询。
在您的安全规则中,您必须允许此收集组查询,方法是为帖子收集组编写一个读取或列出规则
list。
match /{path=**}/post/{post}{允许读取: if request.auth.uid != null;}
如果您正在询问是否可以使用安全规则将收集组查询限制在称为"posts“的子集,这是不可能的。查询中将考虑所有名为“post”的集合。这就是为什么通配符也必须位于匹配路径的开头的原因,因为其他任何东西都仍然是对集合集合的约束。
这一切都只是security rules are not filters的主要规则的一个变体。它们既不能过滤用于常规查询的文档,也不能过滤用于收集组查询的集合。
该文档进一步帮助您了解如何对数据建模,以便可以在客户端应用过滤器,并将其与正在搜索的文档中存在的字段进行匹配。客户端可以始终使用where子句过滤结果,但它还必须与安全规则的约束相匹配。
https://stackoverflow.com/questions/56047515
复制相似问题