Ваше правило 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});
Также см .:
Вы преобразовываете трехмерную антенную решетку в нижний индекс myArray[10][10][10]
четыре раза myArray[i][t][x][y]
. Необходимо будет, вероятно, добавить другой размер к массиву. Также рассмотрите контейнер как Повышение. MultiArray, хотя это, вероятно, находится вне Вашего понимания в этой точке.
Что измениться? Кроме 3 или 4 размерных проблем массива, необходимо избавиться от магических чисел (10 и 9).
const int DIM_SIZE = 10;
int myArray[DIM_SIZE][DIM_SIZE][DIM_SIZE];
for (int i = 0; i < DIM_SIZE; ++i){
for (int t = 0; t < DIM_SIZE; ++t){
for (int x = 0; x < DIM_SIZE; ++x){
int myArray[10][10][10];
должен быть
int myArray[10][10][10][10];
Вы пытаетесь получить доступ к 3 размерным массивам с 4, разыменовывает
Вам только нужны 3 цикла вместо 4, или int myArray[10][10][10][10];