我的请求看起来很简单:使用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()
仅应用于获取单个文档。
也许我可以尝试使用云功能...
我有解决问题的办法吗? 谢谢您的帮助!
答案 0 :(得分:1)
从一般意义上讲(无论是数据库规则还是客户端SDK),都无法知道集合的大小。您可以选择将自己记录在由Cloud Functions管理的另一个文档中。但也要记住,一个文档每秒只能写入10次,因此繁忙的收藏集可能无法与用于记录大小的文档保持同步。
您还可以使用Cloud Functions从集合中删除文档,以响应添加了新文档,但是现在知道集合的大小的限制是有问题的。找到一种查询方法以查找要删除的文档(例如,通过时间戳记)可能会更好,而不是依赖于集合的大小。