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 中的重复文档可以通过文档编辑的云功能进行更新吗?的主要内容,如果未能解决你的问题,请参考以下文章