在Firestore规则中限制子集合中的文档数量

时间:2018-10-29 09:33:42

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

我的请求看起来很简单:使用Firestore规则限制子集合中的文档数。

我已经知道使用.size()可以知道数组的大小。因此,您可能会问为什么我不使用数组存储项目?好吧,我希望“普通”用户不能更新我的父文档字段,而能够将文档添加到我的子集合中。

我已经尝试这样做:

match /slots/{slot} {
      allow read: if true;
      allow write: if getRole() == 'ADMIN';

      match /participants/{participant} {
        allow read: if true;
        allow create: if get(/databases/$(database)/documents/slots/$(slot)/participants).size() < 2;
        allow delete: if participant.data.id == request.auth.uid || getRole() == 'ADMIN';
      }
    }

但是get(/databases/$(database)/documents/slots/$(slot)/participants)不起作用,因为get()仅应用于获取单个文档。

也许我可以尝试使用云功能...

我有解决问题的办法吗? 谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

从一般意义上讲(无论是数据库规则还是客户端SDK),都无法知道集合的大小。您可以选择将自己记录在由Cloud Functions管理的另一个文档中。但也要记住,一个文档每秒只能写入10次,因此繁忙的收藏集可能无法与用于记录大小的文档保持同步。

您还可以使用Cloud Functions从集合中删除文档,以响应添加了新文档,但是现在知道集合的大小的限制是有问题的。找到一种查询方法以查找要删除的文档(例如,通过时间戳记)可能会更好,而不是依赖于集合的大小。