Firestore 中的重复文档可以通过文档编辑的云功能进行更新吗?

Posted

技术标签:

【中文标题】Firestore 中的重复文档可以通过文档编辑的云功能进行更新吗?【英文标题】:Can duplicated documents in Firestore be updated via cloud function on document edits? 【发布时间】:2020-07-25 02:13:19 【问题描述】:

我设置了以下 Firestore:

用户/uid/关注/followingPersonUid/ 用户/uid/关注者/followerPersonUid/

因此,如果用户 A 关注用户 B,则用户 A 将被添加到用户 B 的关注者子集合中,用户 B 将被添加到用户 A 的关注子集合中

但假设用户 A 更新了他的个人资料信息(姓名、照片、用户名等)。然后他的用户文档将在他的文档中更改,但无论他是其他用户(如用户 B 或 E & F)的关注者子集合中的关注者,这都需要更改。

这可以通过云功能完成吗? 我为云函数创建了一个 onCreate() 触发器,但该函数不知道他是追随者的其他用户 (uid) 的列表,因此我无法在需要的地方应用此更改。

这是我在 Firebase CLI 中的函数,这是一个 firestore .onUpdate() 触发器。我已经评论了我被困的地方

export const onUserDocUpdate = functions.region('asia- 
east2').firestore.document
('Users/userId').onUpdate((change, context) => 
const upDatedUserData = change.after.data()

const newName = upDatedUserData?.name
const profilePhotoChosen = upDatedUserData?.profilePhotoChosen
const updatersUserId = upDatedUserData?.uid
const newUserName = upDatedUserData?.userName

//This is where I am stuck, I have the updated document info but how do
//I find the other documents at firestore that needs updation with this 
//updated information of the user
    return admin.firestore()
    .collection('Users').doc('followeeUserId')
    .collection('Followers').doc(updatersUserId)
    .set(
    name: newName, 
    userName: newUserName,
    profilePhotoChosen: profilePhotoChosen,
    uid: updatersUserId
  )

)

我是否应该使用可调用函数,其中客户端可以发送以下需要更新的用户 ID 列表。

【问题讨论】:

该列表会在用户自己的following 子集合中吗?无论哪种方式:如果我们看到minimal code that reproduces where are stuck,可能会更容易提供帮助。 嗨弗兰克,我已经添加了代码来显示我卡在哪里...... 【参考方案1】:

据我了解,用户更新了他们的个人资料,然后您还想在所有关注者的数据中更新该个人资料。由于您同时保留了关注者和关注者,因此您应该可以只读取触发云功能的用户的子集合:

export const onUserDocUpdate = functions.region('asia- 
east2').firestore.document
('Users/userId').onUpdate((change, context) => 
  const upDatedUserData = change.after.data()

  const newName = upDatedUserData?.name
  const profilePhotoChosen = upDatedUserData?.profilePhotoChosen
  const updatersUserId = upDatedUserData?.uid
  const newUserName = upDatedUserData?.userName

  const userDoc = change.after.ref.parent; // the user doc that triggered the function
  const followerColl = userDoc.collection("Followers");

  return followerColl.get().then((querySnapshot) => 
    const promises = querySnapshot.documents.map((doc) => 
      const followerUID = doc.id;
      return admin.firestore()
        .collection('Users').doc(followerUID)
        .collection('Followees').doc(updatersUserId)
        .set(
          name: newName, 
          userName: newUserName,
          profilePhotoChosen: profilePhotoChosen,
          uid: updatersUserId
        )
    );
    return Promise.all(promises);
  );
)

可能是我有一些拼写错误/语法错误,但语义应该非常可靠。我不确定的最重要的事情是您维护的关注者/关注者逻辑,因此我使用了集合名称,因为它们对我来说最有意义,这可能与您的相反。

【讨论】:

嗨弗兰克,非常感谢您的回复...这真的很有帮助...

以上是关于Firestore 中的重复文档可以通过文档编辑的云功能进行更新吗?的主要内容,如果未能解决你的问题,请参考以下文章

访问 Firestore 规则中的父文档字段

如何为 Firestore 文档设置到期日期 [重复]

删除 Firestore 集合中的所有文档

更新firestore文档中嵌套对象中的字段?

Recycler View Android中的Firestore数据[重复]

使用 GCF/pubsub 更新 Firestore 文档中的计数器