我通读了collection group query documentation,并想知道递归通配符(rules_version = '2'
){path=**}
是否对于使收集组查询起作用是必需的。 / p>
我会给你一个例子(根据文档中的例子):
数据库使用带有不同论坛的forums
集合。
每个论坛可以有多个posts
。
这将导致以下结构:forums/{forum}/posts/{post}
。
以下两个摘录都将成功匹配所有帖子:
match /forums/{forum}/posts/{post} {
allow list;
}
match /{path=**}/posts/{post} {
allow list;
}
如果我正确理解了文档,则第一个match
不够不足以使posts
上的集合组查询正常工作。
我知道第二个match
也将也匹配名称为{{1}的任何其他子集合。
第posts
个够吗?
如果不是,递归通配符match
是否总是必须是顶级的,即直接在{path=**}
中?该文档使它看起来确实如此。
答案 0 :(得分:1)
文档表明您的第一条规则不足不允许帖子对收藏夹进行查询。
在安全规则中,您必须通过为帖子收集组编写读取或列表规则来允许此[收集组]查询。
match /{path=**}/posts/{post} { allow read: if request.auth.uid != null; }
如果您要问是否可以使用安全性规则将集合组查询约束到称为“帖子”的子集合的子集,则不可能。查询中将考虑所有称为“帖子”的集合。这就是为什么通配符必须也必须位于匹配路径的开始的原因,因为仍然有其他尝试来限制集合集。
这仅仅是security rules are not filters的主要规则的变体。他们既不能过滤用于常规查询的文档,也不能过滤用于集合组查询的集合。
该文档的确可以帮助您了解如何对数据建模,以便可以在客户端上应用过滤器,并将其与要搜索的文档中存在的字段进行匹配。客户端可能总是使用where子句来过滤结果,但它也必须匹配安全规则的约束。