Спасибо! это был спасатель

рвых, извините за мой ужасный английский, это не мой родной язык ...

Я строю простое приложение в Firebase, используя базу данных Firestore. В моем приложении пользователи являются членами небольших групп. У них есть доступ к данным других пользователей. Чтобы не запрашивать слишком много документов (по одному на пользователя, во вложенной коллекции документа группы), я решил добавить данные пользователей в массив внутри документа группы. Вот документ моей группы:

{
   "name":"fefefefe",
   "days":[false,false,false,false,true],
   "members":[
       {"email":"[email protected]","id":"aaaaaaaa","name":"Mavireck"}, 
       {"email":"[email protected]","id":"bbbbbbbb","name":"Mavireck2"}, 
   ],
}

Как я могу проверить с правилами безопасности, если пользователь находится в группе? Должен ли я использовать объект вместо этого? Я действительно предпочел бы не использовать подколлекцию для пользователей, потому что я слишком быстро достигну пределов бесплатной квоты ...

Спасибо за уделенное время !

РЕДАКТИРОВАТЬ: Спасибо за ответ. Я изменю его на объект: «Участники»: {uid1: {}, uid2: {}}

Ответы на вопрос(2)

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{documentId} {
      // works if `members` = [uid1, uid2, uid3]
      // no way to iterate over a collection and check members
      allow read: if request.auth.uid in resource.data.members;
      // you could also have `members` = {uid1: {}, uid2: {}}
      allow read: if resource.data.members[request.auth.uid] != null;
    }
  }
}

Вы также можете использовать подколлекции:

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow a user to read a message if the user is in the room
    match /rooms/{roomId} {
      match /documents/{documentId} {
        allow read: if exists(/databases/$(database)/documents/documents/$(documentId)/users/$(request.auth.uid));
      }
      match /users/{userId} {
        // rules to allow users to operate on a document
      }
    }
  }
}
 Mavireck24 окт. 2017 г., 16:41
Я не могу редактировать, вот мой последний комментарий:allow read: if resource.data.membres[(request.auth.uid)] != null; пока не работаетallow read: if resource.data.membres != null; делает.
 jackz31401 янв. 2019 г., 09:05
Если вы пытаетесь использовать только предоставленный эмулятор, попробуйте его в реальном приложении, если оно у вас есть. Известно, что эмулятор имеет проблемы с массивами.
 Mavireck24 окт. 2017 г., 16:16
Я сделал простой тест на месте:if(doc.data()['members'][(firebase.auth()currentUser.uid)] != null){console.log("not null)}... это всегда лог "не нуль"
 Mavireck24 окт. 2017 г., 15:55
Спасибо, но я не могу заставить его работать ... Я совершенно уверен, что моя база данных верна: у меня есть объект "members" в документе группы, содержащий объекты с большим количеством пользовательских сведений. :members = {uid1: {}, uid2: {}}, Однако используяallow read: if resource.data.members[request.auth.uid] != null; не сработает Я тоже пробовалresource.data.members[request.auth.uid].name != null;, а такжеresource.data.members[(request.auth.uid)] != null;

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

service cloud.firestore {
  match /databases/{database}/documents {
    match /repositories/{accountId} {
      allow read, write: if request.auth.uid in get(/databases/$(database)/documents/accounts/$(accountId)).data.users
    }
  }
}
 Assaf S.12 нояб. 2018 г., 16:15
Спасибо! это был спасатель

Ваш ответ на вопрос