Firebase 如何在一个集合中限制读写,在另一个集合中限制写,这两个集合都与云firestore中的同一用户相关?

Firebase 如何在一个集合中限制读写,在另一个集合中限制写,这两个集合都与云firestore中的同一用户相关?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我在CloudFireStore中有用户和配置文件集合,如下图所示。我将用户详细信息存储在用户集合中,文档ID作为用户的firebase UID,以便只有特定用户可以更新和读取自己的数据,而不是其他用户。我有用户集合的安全规则,类似于这个答案 现在,我的配置文件集合应该是文档的公共集合,这样就可以引用这些ID来读取配置文件的详细信息,但是每当用户更新其在用户集合中的数据时,如果公共字段被更新,它也应该反映在配置文件文档中。我怎样才能做到这一点 注意:在用户文档中,字段类似于姓名、年龄、付款详细信

我在CloudFireStore中有用户和配置文件集合,如下图所示。我将用户详细信息存储在用户集合中,文档ID作为用户的firebase UID,以便只有特定用户可以更新和读取自己的数据,而不是其他用户。我有用户集合的安全规则,类似于这个答案 现在,我的配置文件集合应该是文档的公共集合,这样就可以引用这些ID来读取配置文件的详细信息,但是每当用户更新其在用户集合中的数据时,如果公共字段被更新,它也应该反映在配置文件文档中。我怎样才能做到这一点

注意:在用户文档中,字段类似于姓名、年龄、付款详细信息,而在配置文件中,字段仅类似于姓名和年龄


您的功能需求:

每当用户在用户集合中更新其数据时,也应 如果公共字段已更新,则会反映在配置文件文档中

您可以使用,如下所示:

// 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 () {
    // ...
});
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 ....
    }

  }
}

根据
write
安全规则,您可以将其定义如下:

// 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 () {
    // ...
});
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 ....
    }

  }
}

所以,我读了一些帖子,并考虑在用户文档更新时使用云功能,您认为考虑成本和可扩展性是一个好主意吗?云功能也是一个有效的选择。这实际上取决于您的通用应用程序体系结构。很难用你分享的信息告诉你什么更好。如果在前端中,您拥有所有必要的数据(
name
age
paymentDetails
,…),则批量写入是一个非常好的选择。是的,我在前端中有这些详细信息。我想公开文档ID,假设这些用户对某篇文章发表了一些评论,那么他们的参考ID应该在那里,从那里访问他们的公共配置文件。这不知何故是另一个问题。您只需要在帖子的评论中保存用户ID。您可以通过
firebase.auth().currentUser.uid
获取用户id,请参阅