Предотвращение дублирования записей в правилах Firestore не работает - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь предотвратить повторяющиеся записи, используя правила Google Firestore, однако это не работает. Правило, которое я пытаюсь сделать так:

service cloud.firestore {  
  // Prevent duplicate messages
  match /databases/{database}/documents {
    match /messages/{message} {
        allow read;
      allow write: if request.resource.data.m != resource.data.m;
    }
  }
}

Из того, что я прочитал, это должно работать.

enter image description here

Что я делаю не так?

1 Ответ

0 голосов
/ 17 января 2019

Ваше правило if request.resource.data.m != resource.data.m гласит, что поле m может быть записано, только если оно не совпадает с текущим значением поля m в том же документе .

Нет способа проверить наличие дубликатов во всей коллекции, так как для этого потребуется Cloud Firestore для чтения всех документов в коллекции (которая не масштабируется).

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

match /unique_ms/{m} {
  allow create;
}

Вышесказанное позволяет только создать документ, но не позволяет его обновить. Это означает, что если кто-то создал документ с определенным значением m, никто не сможет его перезаписать.

Альтернативой с использованием правила write может быть:

allow write: if !exists(/databases/$(database)/documents/unique_ms/{m});

Также см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...