Java 获取firestore中已删除文档的ID

Java 获取firestore中已删除文档的ID,java,firebase,google-cloud-firestore,google-admin-sdk,Java,Firebase,Google Cloud Firestore,Google Admin Sdk,我收集了几千份文件。这些文档具有子集合,其中包含文档。现在我删除了很多最高级别的文档 结构: MyCollection=>MyDocument=>MySubcollection=>MySubdocument 现在我意识到,文件被删除了(没有显示在任何查询中),但子集合及其文档仍然存在。现在我不知道如何删除它们,因为我不知道我删除的文档的ID 当我试图通过向我的集合发送一个查询来读取所有文档来查找ID时,删除的文档(按设计)不再包括在内。那么我现在如何计算出他们的ID来删除他们的子集合呢 谢谢你的

我收集了几千份文件。这些文档具有子集合,其中包含文档。现在我删除了很多最高级别的文档

结构:
MyCollection=>MyDocument=>MySubcollection=>MySubdocument

现在我意识到,文件被删除了(没有显示在任何查询中),但子集合及其文档仍然存在。现在我不知道如何删除它们,因为我不知道我删除的文档的ID

当我试图通过向我的集合发送一个查询来读取所有文档来查找ID时,删除的文档(按设计)不再包括在内。那么我现在如何计算出他们的ID来删除他们的子集合呢

谢谢你的建议

这完全取决于你的确切目标

如果要删除MyCollection集合中的ALL文档,包括ALL子集合中的ALL文档,可以通过以下命令使用Firebase CLI:

firebase firestore:delete MyCollection -r
执行
firebase firestore:delete--help
以获取更多选项

当然,这只能由Firebase项目的所有者完成


如果希望允许其他用户从前端(即所有文档,包括所有子集合)执行相同的操作,可以使用文档中详细介绍的技术

如本文件所述:

您可以利用Firebase命令行界面(CLI)中的
firestore:delete
命令。您可以使用
Firebase tools
包将Firebase CLI的任何功能导入Node.js应用程序

Firebase CLI使用Cloud Firestore REST API查找指定路径下的所有文档并分别删除它们。此实现不需要了解应用程序的特定数据层次结构,甚至可以查找和删除不再具有父级的“孤立”文档


如果您只想删除
MyCollection
集合中文档的一个子集,以及子集合中的文档,您可以使用与上面相同的方法来删除文档路径,例如:

firestore:delete MyCollection/MyDocument -r

最后,如果您的问题是您已经删除了“父”文档,并且您不知道如何删除(孤立)子集合中的文档(因为您不知道父集合的ID),您可以使用集合组查询来查询所有
MySubcollection
子集合,并检测父文档是否存在。下面用JavaScript编写的代码就可以做到这一点

  const db = firebase.firestore();
  const parentDocReferences = [];
  const deletedParentDocIds = [];

  db.collectionGroup('MySubcollection')
    .get()
    .then((querySnapshot) => {
      querySnapshot.forEach((doc) => {
        console.log(doc.id);
        console.log(doc.ref.parent.parent.path);
        parentDocReferences.push(db.doc(doc.ref.parent.parent.path).get());
      });
      return Promise.all(parentDocReferences);
    })
    .then((docSnapshots) => {
      docSnapshots.forEach((doc) => {
        console.log(doc.id);
        console.log(doc.exists);
        if (!doc.exists && deletedParentDocIds.indexOf(doc.id) === -1) {
          deletedParentDocIds.push(doc.id);
        }
      });
      
      // Use the deletedParentDocIds array
      // For example, get all orphan subcollections reference in order to delete all the documents in those collections (see https://firebase.google.com/docs/firestore/manage-data/delete-data#collections)
      deletedParentDocIds.forEach(docId => {
         
        const orphanSubCollectionRef = db.collection(`MyCollection/${docId}/MySubcollection`);
        // ...
        
      });
      
    });
这完全取决于你的确切目标

如果要删除MyCollection集合中的ALL文档,包括ALL子集合中的ALL文档,可以通过以下命令使用Firebase CLI:

firebase firestore:delete MyCollection -r
执行
firebase firestore:delete--help
以获取更多选项

当然,这只能由Firebase项目的所有者完成


如果希望允许其他用户从前端(即所有文档,包括所有子集合)执行相同的操作,可以使用文档中详细介绍的技术

如本文件所述:

您可以利用Firebase命令行界面(CLI)中的
firestore:delete
命令。您可以使用
Firebase tools
包将Firebase CLI的任何功能导入Node.js应用程序

Firebase CLI使用Cloud Firestore REST API查找指定路径下的所有文档并分别删除它们。此实现不需要了解应用程序的特定数据层次结构,甚至可以查找和删除不再具有父级的“孤立”文档


如果您只想删除
MyCollection
集合中文档的一个子集,以及子集合中的文档,您可以使用与上面相同的方法来删除文档路径,例如:

firestore:delete MyCollection/MyDocument -r

最后,如果您的问题是您已经删除了“父”文档,并且您不知道如何删除(孤立)子集合中的文档(因为您不知道父集合的ID),您可以使用集合组查询来查询所有
MySubcollection
子集合,并检测父文档是否存在。下面用JavaScript编写的代码就可以做到这一点

  const db = firebase.firestore();
  const parentDocReferences = [];
  const deletedParentDocIds = [];

  db.collectionGroup('MySubcollection')
    .get()
    .then((querySnapshot) => {
      querySnapshot.forEach((doc) => {
        console.log(doc.id);
        console.log(doc.ref.parent.parent.path);
        parentDocReferences.push(db.doc(doc.ref.parent.parent.path).get());
      });
      return Promise.all(parentDocReferences);
    })
    .then((docSnapshots) => {
      docSnapshots.forEach((doc) => {
        console.log(doc.id);
        console.log(doc.exists);
        if (!doc.exists && deletedParentDocIds.indexOf(doc.id) === -1) {
          deletedParentDocIds.push(doc.id);
        }
      });
      
      // Use the deletedParentDocIds array
      // For example, get all orphan subcollections reference in order to delete all the documents in those collections (see https://firebase.google.com/docs/firestore/manage-data/delete-data#collections)
      deletedParentDocIds.forEach(docId => {
         
        const orphanSubCollectionRef = db.collection(`MyCollection/${docId}/MySubcollection`);
        // ...
        
      });
      
    });

谢谢最后一个选项是我需要的。我真的不明白你为什么要存储parentDocReferences。我真的不需要它们,是吗?
doc.exists
引用了父文档?如果您对存储parentDocReferences的问题的意思是“为什么要执行
parentDocReferences.push()
?”,这是因为我们希望对异步
get()
方法发出数量不确定的调用,以便获取所有父文档。我们需要知道所有这些调用何时完成,因此我们使用
Promise.all()
Promise.all()
“返回解析为输入承诺结果数组的单个承诺。此返回的承诺将在所有输入承诺解析后解析”。谢谢你的澄清。这太完美了。现在我只需要用Java实现它:)谢谢!最后一个选项是我需要的。我真的不明白你为什么要存储parentDocReferences。我真的不需要它们,是吗?
doc.exists
引用了父文档?如果您对存储parentDocReferences的问题的意思是“为什么要执行
parentDocReferences.push()
?”,这是因为我们希望对异步
get()
方法发出数量不确定的调用,以便获取所有父文档