Как ограничить чтение и запись в одной коллекции и ограничить запись в другой коллекции, которые связаны с одним и тем же пользователем в облачном пожарном хранилище? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть коллекция пользователей и профилей в облачном хранилище, как показано на рисунке ниже. Я храню данные о пользователях в коллекции пользователей с идентификатором документа в качестве пользовательского идентификатора Firebase пользователя, так что только конкретный пользователь может обновлять и читать свои собственные данные, а не другие пользователи. У меня есть правила безопасности для коллекции пользователей, что-то вроде этого ответа Отключить запрос коллекции в Firebase Cloud Firestore с правилами Теперь моя коллекция профилей должна быть общедоступной c коллекцией документов, чтобы на эти идентификаторы можно было ссылаться для чтения детали профилей, но всякий раз, когда пользователь обновляет свои данные в коллекции пользователей, они также должны отражаться в документе профиля, если обновляются общие поля. Как мне этого добиться?

PS: в пользовательских полях документа есть имя, возраст, реквизиты платежа, а в профиле - только имя и возраст.

enter image description here

1 Ответ

1 голос
/ 12 апреля 2020

Ваше функциональное требование:

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

Вы можете использовать пакетную запись следующим образом:

// Get a new write batch
var batch = db.batch();

var userId = '......';

var commonData = {
    name: '...',
    age: ...
}

var userRef = db.collection('users').doc(userId);
batch.update(userRef, {paymentDetails : "...", ...commonData});  
// We use the spread syntax, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals

var profileRef = db.collection('profiles').doc(userId);
batch.update(profileRef, commonData);

// Commit the batch
batch.commit().then(function () {
    // ...
});

В терминах write правил безопасности вы можете определить их следующим образом:

service cloud.firestore {
  match /databases/{database}/documents {

    match /users/{userId} {
      allow write: if request.auth.uid == userId;
      allow ....
    }

    match /profiles/{userId} {
      allow write: if request.auth.uid == userId;
      allow ....
    }

  }
}
...