Облачный Firestore управляет правильным синтаксисом - PullRequest
0 голосов
/ 20 ноября 2019

Мне нужно написать правила для Cloud Firestore.

Я хочу, чтобы мои правила позволяли создавать новый документ в коллекции:

newDoc(field1="value-1", field2="value-2", field3="other-miscellaneous-values")

, только если другой документ уже не существуетв коллекции с:

(field1 == "value-1") and (field2 == "value-2")

Хотя это не очень сложно, но все же слишком сложно, чтобы найти его в качестве примера в любом уроке, который я нашел в сети.

Кроме того,пользователь должен иметь возможность перечислять и читать все документы в коллекции, если он / она желает.

Вот что я пробовал, но это не работает:

service cloud.firestore {
  function alreadyExists(document) {
              return exists((resource.data.field1==request.resource.data.field1)&&
                           (resource.data.field2==request.resource.data.field2))
  }

  match /databases/{database}/documents {
    match /My_Collection/{anything=**} {
      allow read;
      allow write: if !(alreadyExists(request.resource.data));
    }
  }
}

Iнадеюсь, кто-нибудь может дать мне несколько советов, чтобы заставить его работать.

Ответы [ 2 ]

1 голос
/ 20 ноября 2019

Правила безопасности могут только проверять, существует ли документ по определенному пути (с exists). Невозможно проверить, существует ли в правилах документ с определенным значением.

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

Если у вас уже есть стратегия идентификации, которую вы не можете изменить, рассмотрите возможность добавления вторичнойколлекция, содержащая уникальные комбинации, как показано в моем ответе здесь: Предотвращение дублирования записей в правилах Firestore не работает .

1 голос
/ 20 ноября 2019

Это невозможно с правилами безопасности, поскольку правила не способны выполнять произвольные запросы. Единственный поддерживаемый тип запроса - это простой метод get (), если вы знаете путь к документу для извлечения.

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

...