收集组查询是否需要{path = **}?

时间:2019-05-08 19:09:56

标签: firebase google-cloud-firestore firebase-security firebase-security-rules

我通读了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=**}中?该文档使它看起来确实如此。

1 个答案:

答案 0 :(得分:1)

文档表明您的第一条规则不足不允许帖子对收藏夹进行查询。

  

在安全规则中,您必须通过为帖子收集组编写读取或列表规则来允许此[收集组]查询。

match /{path=**}/posts/{post} {
  allow read: if request.auth.uid != null;
}

如果您要问是否可以使用安全性规则将集合组查询约束到称为“帖子”的子集合的子集,则不可能。查询中将考虑所有称为“帖子”的集合。这就是为什么通配符必须也必须位于匹配路径的开始的原因,因为仍然有其他尝试来限制集合集。

这仅仅是security rules are not filters的主要规则的变体。他们既不能过滤用于常规查询的文档,也不能过滤用于集合组查询的集合。

该文档的确可以帮助您了解如何对数据建模,以便可以在客户端上应用过滤器,并将其与要搜索的文档中存在的字段进行匹配。客户端可能总是使用where子句来过滤结果,但它也必须匹配安全规则的约束。