Ограничить количество документов в подгруппе правил пожарного депо
Моя просьба довольно проста: ограничение количества документов во вложенной коллекции с использованием правил 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 ответ
В общем смысле (как в правилах базы данных, так и в клиентских SDK) нет способа узнать размер коллекции. У вас есть возможность записать это самостоятельно в другой документ, управляемый облачными функциями. Но имейте в виду также, что документ ограничен 10 записями в секунду, поэтому загруженные коллекции могут не синхронизироваться с документом, используемым для записи размера.
Вы также можете использовать облачные функции для удаления документов из коллекции в ответ на добавление новых документов, но ограничение знания размера коллекции будет проблематичным. Может быть, лучше найти способ запроса для поиска документов для удаления (например, по метке времени), а не в зависимости от размера коллекции.