node.js - 如何从不同集合中的 Firestore 中删除文档
问题描述
所以我在firestore有2个收藏,
- 用户(集合)
- 检查(收集)
用户只有被命名为不同电子邮件地址的文档 检查有被命名为不同电子邮件地址的文档,然后每个文档都有另一个名为“assignedToMe”的集合,然后这个集合有不同的文档,命名为一些唯一的 id。
我想要做的是每当我删除一个用户时,我希望它的名为他的电子邮件地址的文档也从检查(集合)中删除。
我在这里遇到的问题是我能够从用户(集合)中删除用户,但无法删除该特定用户的检查(集合)中的文档,这是我的代码和 firestore 的结构。
router.use("/delete", [auth, admin], async function (req, res, next) {
const { email } = req.body;
const userRef = db.collection("Users").doc(email);
const insRef = db.collection("Inspection").doc(email);
const user = await userRef.get();
const inspection = await insRef.get();
if (!user.exists) {
return res.status(404).send("This user has already been deleted!");
} else {
const result = userRef.delete();
if (!inspection.empty) {
const myres = insRef.delete();
}
result && res.status(200).send("User deleted successfully.");
}
});
解决方案
Inspection
文档在控制台中以斜体字体显示:这意味着这些文档仅作为子集合的“容器”出现,但assignedToMe
它们不是“真正的”文档。在这个答案中查看更多信息。
此外,删除文档不会删除其子集合中存在的文档,如链接答案中所述。您还必须删除子集合文档。
更具体地说,在您的情况下,您需要遍历assignedToMe
子集合以删除它包含的所有文档。您可以对批量写入delete()
中的所有操作进行分组,如下所示:
router.use('/delete', [auth, admin], async function (req, res, next) {
try {
const { email } = req.body;
const userRef = db.collection('Users').doc(email);
const user = await userRef.get();
if (!user.exists) {
return res.status(404).send('This user has already been deleted!');
} else {
const batch = db.batch();
// Deleting the user doc
batch.delete(userRef);
// Deleting the assignedToMe subcollection docs
const assignedToMeRef = db
.collection('Inspection')
.doc(email)
.collection('assignedToMe');
const assignedToMeQuerySnapshot = await assignedToMeRef.get();
assignedToMeQuerySnapshot.forEach((doc) => {
batch.delete(doc.ref);
});
// Note that if the assignedToMe subcollection is empty
// nothing will be added to the batched write by the previous loop
await batch.commit();
result && res.status(200).send('User deleted successfully.');
}
} catch (error) {
console.log(error);
return res
.status(500)
.send('The following error occured: ' + JSON.stringify(error));
}
});
请注意,批量写入最多可包含 500 个操作。如果您计划拥有assignedToMe
超过 499 个文档的子集合(批量写入也会删除用户文档),则需要使用Promise.all()
.
推荐阅读
- python - 如何处理混合大小写正则表达式?
- docker - 如何确保 docker 确认优雅退出?
- python-3.x - 如何编码以重新排列列中的所有文本
- python-3.x - 线程安全删除python中的目录
- javascript - 如何用Javascript来console.log增量变量如a1,a2,a3,a4?
- sharepoint - 如何使用上次提交的表单中的数据填充新表单上的 PowerApps 数据卡值
- android - MediaCodec 使用 inputSurface 编码视频但丢帧
- xpath - 如何获取所有子节点的文本
- python - 每行不满足条件的值的计数
- r - 在使用多个条件的情况下使用 dplyr 和 ifelse 创建新变量