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

Ant*_*ger 6 firebase firebase-security google-cloud-firestore

我的请求在外观上非常简单:使用 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';
      }
    }
Run Code Online (Sandbox Code Playgroud)

get(/databases/$(database)/documents/slots/$(slot)/participants)不能正常工作,因为get()只应用于获取单个文档。

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

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

Dou*_*son 3

一般而言(无论是在数据库规则还是客户端 SDK 中),无法知道集合的大小。您可以选择将其记录在由 Cloud Functions 管理的另一个文档中。但还要记住,文档每秒写入次数限制为 10 次,因此繁忙的集合可能无法与用于记录大小的文档保持同步。

您还可以使用 Cloud Functions 从集合中删除文档,以响应添加的新文档,但现在了解集合大小的限制将会出现问题。最好找到一种查询方式来查找要删除的文档(例如,按时间戳),而不是依赖于集合的大小。