当前位置: 首页 > 知识库问答 >
问题:

如何从不同集合中删除Firestore中的文档

聂鹏云
2023-03-14

所以我有2个系列,

  1. 用户(收藏)
  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.");
  }
}); 

共有1个答案

邹浩
2023-03-14

检查文档在控制台中以斜体字显示:这意味着这些文档仅作为assignedToMe子集合的“容器”存在,但它们不是“真正的”文档。在这个答案中查看更多信息。

此外,删除文档不会删除其子集合中的文档,链接答案中也解释了这一点。您还必须删除子集合文档。

更具体地说,在您的情况下,您需要遍历< code > assigned home 子集合,以便删除它包含的所有文档。您可以将所有< code>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个操作。如果您计划拥有包含超过499个文档的assignedToMe子集合(批处理写入还会删除用户文档),则需要使用Promise.all()

 类似资料:
  • 我如何删除一个特定的文档中的一个集合在fiRecovery使用反应? 我在这里和谷歌上看了看,但我没有发现任何内在相关的东西。 我只是设法从我的集合中删除索引[0]的文档。 这状态idDoc接收所有id文档。 如果我只是传递. doc(idDoc),我会得到以下错误: Firebase Error: Function Collection Reference.doc()要求它的第一个参数是非空字符

  • 问题内容: 我正在寻找清除整个收藏夹的方法。我看到有一个批处理更新选项,但这需要我知道集合中的所有文档ID。 我正在寻找一种简单地删除集合中每个文档的方法。 谢谢! 编辑:下面的答案是正确的,我使用以下方法: 问题答案: 没有API可以一次性删除整个集合(或其内容)。 从Firestore文档中: 要在Cloud Firestore中删除整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。

  • 据我所知,我可以使用云函数以某种方式实现这一点?我试着阅读云函数,但我很迷路。是否有一种方法可以触发云函数,在用户更新帖子时删除子集合中的所有文档?

  • 当我试图在MongoDB中删除集合中的文档时。它没有删除,因为集合已被封顶。我的问题是为什么?在这种情况下,是否有解决方案或其他功能可以删除文档?

  • 当使用Firebase控制台时,可以看到所有文档和集合,甚至是路径中包含不存在的“文档”的子集合。 有没有可能,以某种方式,列出这些文件。既然控制台能做到,看来肯定有办法。如果有可能找到这些文档,是否可以创建一个查询来获取所有不存在但仅限于具有嵌套子集合的文档?(因为所有不存在的文档集将是无限的)

  • 我在Java有一个集合数组列表。 例如,当我这样做时: 测试是集合。 为什么我得到的结果是:[jamesbond] 我只想要jamesbond,但为什么他们也给我[]?