Ограничить количество документов в подгруппе правил пожарного депо

Моя просьба довольно проста: ограничение количества документов во вложенной коллекции с использованием правил 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 записями в секунду, поэтому загруженные коллекции могут не синхронизироваться с документом, используемым для записи размера.

Вы также можете использовать облачные функции для удаления документов из коллекции в ответ на добавление новых документов, но ограничение знания размера коллекции будет проблематичным. Может быть, лучше найти способ запроса для поиска документов для удаления (например, по метке времени), а не в зависимости от размера коллекции.

Другие вопросы по тегам