英文:
Firestore Database: How to delete documents that reference an initially deleted document?
问题
我正在使用Google Firestore数据库为我正在开发的应用程序。数据库布局如下:
用户
---电子邮件
---姓名
---等等...
帖子
---[用户ID]
---图像
---等等...
当我删除一个用户时,我希望所有引用该用户ID的帖子也被删除。我正在使用Google Firestore数据库和Flutterflow,并且用户将从我正在构建的应用程序中删除他们的帐户。
我尝试过使用“删除用户数据”扩展,但我无法正确配置它以使其工作。也许它不适用于这种情况?
英文:
I am using google Firestore Database for an app i am working on. The database layout is as follows:
User
---name
---etc...
Post
---[User ID]
---image
---etc...
When i delete a user, i want all posts that reference the users ID to also be deleted. I am using Google Firestore Database alongside Flutterflow, and the users will be deleting their account from the app that i am building.
I have tried to use the Delete User Data extension but i could not configure it correctly to work. Perhaps it is not made for this scenario?
答案1
得分: 1
The extension deletes documents associated with a specific user ID when the user is deleted from Firebase Authentication. In your case, you want to delete documents from a collection when a master document is deleted in another collection.
一种可能的解决方案是使用后台触发的 Cloud Function,在从 User
Firestore 集合中删除文档时触发,然后删除 Post
集合中的所有相应文档。
在你的情况下,可以参考以下代码示例:
exports.deleteUsers = functions
.firestore
.document('User/{docId}')
.onDelete(async (snap, context) => {
try {
const db = admin.firestore();
let batch = db.batch();
const querySnapshot = await db.collection("Post").where("ArtistReference", "==", context.params.docId).get();
querySnapshot.forEach((doc) => {
batch.delete(doc.ref);
});
return batch.commit();
} catch (error) {
//...
}
});
请注意,批量写入最多可以包含 500 个操作。如果有超过 500 个与用户对应的 "Post" 文档的情况,你应该使用 Promise.all()
。
英文:
> I have tried to use the Delete User Data extension but i could not
> configure it correctly to work. Perhaps it is not made for this
> scenario?
New answer
The extension deletes docs associated to a specific user ID when the user is deleted from Firebase Authentication. In your case you want to delete documents from a collection when a (master) document is deleted in another collection.
One possibility in your case would be to use a background triggered Cloud Function that is triggered when a document is deleted from the User
Firestore collection and that deletes all the corresponding docs in the Post
collection.
Something along the following lines:
exports.deleteUsers = functions
.firestore
.document('User/{docId}')
.onDelete(async (snap, context) => {
try {
const db = admin.firestore();
let batch = db.batch();
const querySnapshot = await db.collection("Post").where("ArtistReference", "==", context.params.docId).get();
querySnapshot.forEach((doc) => {
batch.delete(doc.ref);
});
return batch.commit();
} catch (error) {
//...
}
});
Note that a batched write can only contain up to 500 operations. If you have cases with more than 500 "Post" docs corresponding to a user, you should use Promise.all()
.
Erroneous answer
(The extension deletes docs associated to a specific user ID when the user is deleted from Firebase Authentication and not when another Firestore doc is deleted)
As explained in the extension documentation, in your case (a document field is used to associate the user UID with the document) you need to enable the auto discovery and configure the extension as follows:
> Auto discovery search fields
>
> If auto discovery is enabled, specify what document fields are used to associate the UID with the document. The extension will delete
> documents where the value for one or more of these fields matches the
> deleting user’s UID.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论